在TCL中代码有什么区别:
global MyVar
set MyVar 5
和代码
set ::MyVar 5
?据我所知:: MyVar意味着MyVar将是一个全局变量。那么区别是什么呢?
发布于 2019-05-16 15:57:30
如果这是在一个过程中,那么设置的变量或放入的值中没有功能差异。(global
在过程之外没有任何影响,以及使用局部变量表的其他东西,例如lambdas和方法。)
实际差异在于具体如何完成。特别是,global
设置一次以便将来的非限定变量访问很快,而使用限定形式总是进行完全查找(可能涉及多个哈希表访问)。效果是这样的,即使用完全限定的形式单次读取或写入更快,如果完成多次访问总是更快global
(并且在global
调用中多个变量的效果变得更强一些,因为一些成本是可以分摊的)。
但是不要相信我的话。制作一些示例程序并自己测试time
,也许是这样的:
proc write1 {} {
global MyVar
set MyVar 5
return
}
proc write2 {} {
global MyVar
set MyVar 5
set MyVar 5
return
}
proc write3 {} {
global MyVar MyOtherVar
set MyVar 5
set MyOtherVar 5
return
}
proc write4 {} {
global MyVar MyOtherVar
set MyVar 5
set MyOtherVar 5
set MyVar 5
set MyOtherVar 5
return
}
proc write5 {} {
set ::MyVar 5
return
}
proc write6 {} {
set ::MyVar 5
set ::MyVar 5
return
}
proc write7 {} {
set ::MyVar 5
set ::MyOtherVar 5
return
}
proc write8 {} {
set ::MyVar 5
set ::MyOtherVar 5
set ::MyVar 5
set ::MyOtherVar 5
return
}
foreach cmd {write1 write2 write3 write4 write5 write6 write7 write8} {
# Execute once to ensure everything is internally optimised
$cmd
# Now the timing run
puts "$cmd : [time { $cmd } 100000]"
}
在我的笔记本电脑上(现在已经有几年了)运行Tcl 8.6.9,我得到了这个:
write1:每次迭代0.62610808微秒
write2:每次迭代0.63969525微秒
write3:每次迭代0.73437284微秒
write4:每次迭代0.7519245699999999微秒
write5:每次迭代0.62230006微秒
write6:每次迭代0.8437912799999999微秒
write7:每次迭代0.8246234299999999微秒
write8:每次迭代1.2297289900000001微秒
正如您所看到的(并在您自己的硬件上确认自己),write1
速度慢于write5
,但对于其他每对,使用global
是性能获胜。(我对write3
节拍感到有些惊讶write7
,但这些数字不会说谎。)
https://stackoverflow.com/questions/-100006738
复制相似问题