请参阅下面的Tcl 8.4代码和下面的shell输出:(我需要元编码):
% set k a
% set m k
% puts [set $m ]
a
% puts [subst $$m]
a
因此,似乎set $m
和subst $$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。在未来的版本中,我们能否预计会出现这种情况? 感谢
答案 0 :(得分:3)
你可以期待事情保持完全相同。当你使用:
puts [set $m]
Tcl将编译一次以读取m
变量(将结果存储在内部操作堆栈中)读取名称在操作堆栈上的变量,然后调用{{1结果。
当你这样做时:
puts
Tcl将其编译为puts [subst $$m]
和读取$
的结果的串联,对替换引擎的调用(反过来将解析和字节码编译该片段),然后只有{{} 1}}结果。这完全更复杂。
如果你这样做,你会看到差异:
m
第一个只是告诉你,你试图从一个(奇怪命名的)不存在的变量中读取。第二个会退出这个过程。