在 TCL 中访问命名空间变量的最快方法
Fastest way to access namespace variables in TCL
我在TCL有SW。
我需要在不同的命名空间中设置 and/or 查询变量。
我应该使用(例如):
global ::namespace1::varname1
set ::namespace1::varname1 $val
##more code to access/write into a variable
或者我应该使用程序来达到同样的效果,例如?
namespace1::setVarname1 $val
namespace1::getVarname1
哪个查找速度更快?第二种方法肯定更安全
我们使用的是TCL 8.5,以后会升级到Tcl 8.6
谢谢。
如果在程序中,最快的方法是使用global
、variable
、upvar
或namespace upvar
将命名空间变量映射为局部变量.或者至少,如果您不止一次访问(读取或写入)变量,它是最快的;使用上述命令的确切选择取决于你在做什么,在某些情况下可能会对速度产生很大的影响,但对于常量变量名来说,这并不重要。这同样适用于 lambda 项或 class 方法;这是相同的底层机制。
在过程外部,如果您尚未在变量所在的命名空间中执行,最快的访问方式可能是使用完全限定名称。 (Tcl 会将名称的解析缓存在名称的内部表示中,这会大大加快速度。)另一方面,如果它是当前名称空间中的变量,那么使用非限定名称可能会稍微快一些.如果您使用 variable
命令声明变量(对于 ::
以外的名称空间)以防止变量解析器出现任何问题。
总的来说,您不仅可以在这里询问,还可以自己找到答案。 time
命令使测试变得非常简单:
% info patch
8.5.9
% set x 1
1
% time {incr x} 10000
0.3075357 microseconds per iteration
% time {incr ::x} 10000
0.3728569 microseconds per iteration
您应该检查您的代码;不要以为我的时间和你的一样。
我在TCL有SW。 我需要在不同的命名空间中设置 and/or 查询变量。 我应该使用(例如):
global ::namespace1::varname1
set ::namespace1::varname1 $val
##more code to access/write into a variable
或者我应该使用程序来达到同样的效果,例如?
namespace1::setVarname1 $val
namespace1::getVarname1
哪个查找速度更快?第二种方法肯定更安全
我们使用的是TCL 8.5,以后会升级到Tcl 8.6
谢谢。
如果在程序中,最快的方法是使用global
、variable
、upvar
或namespace upvar
将命名空间变量映射为局部变量.或者至少,如果您不止一次访问(读取或写入)变量,它是最快的;使用上述命令的确切选择取决于你在做什么,在某些情况下可能会对速度产生很大的影响,但对于常量变量名来说,这并不重要。这同样适用于 lambda 项或 class 方法;这是相同的底层机制。
在过程外部,如果您尚未在变量所在的命名空间中执行,最快的访问方式可能是使用完全限定名称。 (Tcl 会将名称的解析缓存在名称的内部表示中,这会大大加快速度。)另一方面,如果它是当前名称空间中的变量,那么使用非限定名称可能会稍微快一些.如果您使用 variable
命令声明变量(对于 ::
以外的名称空间)以防止变量解析器出现任何问题。
总的来说,您不仅可以在这里询问,还可以自己找到答案。 time
命令使测试变得非常简单:
% info patch
8.5.9
% set x 1
1
% time {incr x} 10000
0.3075357 microseconds per iteration
% time {incr ::x} 10000
0.3728569 microseconds per iteration
您应该检查您的代码;不要以为我的时间和你的一样。