TCL全局变量与双冒号变量

时间:2019-05-15 15:18:30

标签: tcl

在TCL中,代码之间有何区别:

global MyVar
set MyVar 5

和代码

set ::MyVar 5 

? 据我了解,:: MyVar表示MyVar将是一个全局变量。那么区别是什么呢?

1 个答案:

答案 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

如您所见(并在您自己的硬件上进行确认),write1write5慢,但是对于其他每一对,使用global都是性能上的胜利。 (write3胜过write7,我感到有些惊讶,但数字并没有说谎。)