2016-07-27 114 views
0

我在TCL中有SW。 我需要在不同的命名空间中设置和/或查询变量。 我应该使用(用于exampele):在TCL中访问命名空间变量的最快方法

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
谢谢。

+0

http://stackoverflow.com/a/372​​96301/974155 – Dinesh

+0

类似的问题,但不一样。 1正在调用使用变量的proc,而不是全局变量。 – user1134991

回答

1

如果你是在一个过程中,最快的方式是使用globalvariableupvarnamespace upvar命名空间变量映射为一个局部变量。或者至少如果您不止一次访问(读取或写入)变量,速度最快;上面哪个命令的确切选择取决于你在做什么,在某些情况下可以对速度产生很大的影响,但对于常量变量名称,它并不重要。这同样适用于lambda术语或类方法;它是相同的底层机制。

在过程之外,如果您尚未在变量来自的名称空间中执行,则最快的访问方式可能是使用完全限定名称。 (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 

你应该和你的代码检查;不要以为我的时间和你的时间是一样的。