我在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
谢谢。
答案 0 :(得分:1)
如果您正在使用某个过程,最快的方法是使用global
,variable
,upvar
或namespace 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
您应该使用 代码查看;不要以为我的时间和你的时间是一样的。