当从具有变量名称

时间:2016-06-08 10:28:51

标签: performance variables runtime tcl

请参阅下面的Tcl 8.4代码和下面的shell输出:(我需要元编码):

% set k a
% set m k
% puts [set $m ]
a
% puts [subst $$m]
a

因此,似乎set $msubst $$m具有相同的功能。但是,运行时(在简单的测试用例中)是相当不同的(请参阅下面的shell结果的继续:

% time { set $m } 1000000
0.256435 microseconds per iteration
% time { subst $$m } 1000000
0.627714 microseconds per iteration

可以看出,设置比subst快~2.5倍。 2个问题是:被问到: 1.为什么? 我已经看到它在Tcl 8.5中快了~3.6。在未来的版本中,我们能否预计会出现这种情况? 感谢

1 个答案:

答案 0 :(得分:3)

你可以期待事情保持完全相同。当你使用:

puts [set $m]

Tcl将编译一次以读取m变量(将结果存储在内部操作堆栈中)读取名称在操作堆栈上的变量,然后调用{{1结果。

当你这样做时:

puts

Tcl将其编译为puts [subst $$m] 和读取$的结果的串联,对替换引擎的调用(反过来将解析和字节码编译该片段),然后只有{{} 1}}结果。这完全更复杂。

如果你这样做,你会看到差异:

m

第一个只是告诉你,你试图从一个(奇怪命名的)不存在的变量中读取。第二个会退出这个过程。