在TCL中,代码之间有何区别:
global MyVar
set MyVar 5
和代码
set ::MyVar 5
? 据我了解,:: MyVar表示MyVar将是一个全局变量。那么区别是什么呢?
答案 0 :(得分:4)
如果这是在过程中,则设置哪个变量或放入哪个值没有功能上的区别。 (global
在过程之外以及其他对局部变量表(例如lambda和方法)无效。)
在实际操作上存在实际差异的地方。特别地,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 microseconds per iteration write2 : 0.63969525 microseconds per iteration write3 : 0.73437284 microseconds per iteration write4 : 0.7519245699999999 microseconds per iteration write5 : 0.62230006 microseconds per iteration write6 : 0.8437912799999999 microseconds per iteration write7 : 0.8246234299999999 microseconds per iteration write8 : 1.2297289900000001 microseconds per iteration
如您所见(并在您自己的硬件上进行确认),write1
比write5
慢,但是对于其他每一对,使用global
都是性能上的胜利。 (write3
胜过write7
,我感到有些惊讶,但数字并没有说谎。)