在TCL中访问命名空间变量的最快方法

时间:2016-07-27 11:25:17

标签: namespaces tcl lookup

我在TCL有SW。 我需要在不同的命名空间中设置和/或查询变量。 我应该使用(例如):

const isDisabled = R.lensProp('isDisabled');
const isLoading = R.lensProp('isLoading');

//    toggle :: State -> State
const toggle = R.pipe(
  R.over(isDisabled, R.not),
  R.set(isLoading, true)
);

toggle({isDisabled: true, isLoading: false});
// => {isDisabled: false, isLoading: true}

或者我应该使用程序来实现相同的目标,例如?

global ::namespace1::varname1
set ::namespace1::varname1 $val
##more code to access/write into a variable

哪种查询更快?第二种方法肯定更安全 我们正在使用TCL 8.5,并将在未来升级到Tcl 8.6
谢谢。

1 个答案:

答案 0 :(得分: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

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