TCL全局变量与双冒号变量

TCL全局变量与双冒号变量,tcl,Tcl,在TCL中,代码之间的区别是什么: global MyVar set MyVar 5 代码呢 set ::MyVar 5 ?? 据我所知::MyVar意味着MyVar将是一个全局变量。那么有什么区别呢 如果这是在一个过程中,那么设置什么变量或输入什么值在函数上没有区别。全局在过程和局部变量表(如lambda和方法)之外没有任何影响 真正不同的地方在于具体的做事方式。特别是,global只设置一次,以便将来的非限定变量访问速度更快,而使用限定形式总是进行完整查找,这可能涉及多个哈希表访问。其

在TCL中,代码之间的区别是什么:

global MyVar
set MyVar 5
代码呢

set ::MyVar 5 
??
据我所知::MyVar意味着MyVar将是一个全局变量。那么有什么区别呢

如果这是在一个过程中,那么设置什么变量或输入什么值在函数上没有区别。全局在过程和局部变量表(如lambda和方法)之外没有任何影响

真正不同的地方在于具体的做事方式。特别是,global只设置一次,以便将来的非限定变量访问速度更快,而使用限定形式总是进行完整查找,这可能涉及多个哈希表访问。其效果是,虽然使用完全限定的表单进行单个读取或写入会更快,但如果使用global进行多次访问,则总是会更快,并且使用global call中的多个变量,效果会变得更强,因为一些成本是可摊销的

但不要相信我的话。制作一些示例程序,并随时间为自己进行测试,可能如下所示:

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,但数字并没有说谎。

如果这是在一个过程中,那么设置什么变量或输入什么值在函数上没有什么区别。全局在过程和局部变量表(如lambda和方法)之外没有任何影响

真正不同的地方在于具体的做事方式。特别是,global只设置一次,以便将来的非限定变量访问速度更快,而使用限定形式总是进行完整查找,这可能涉及多个哈希表访问。其效果是,虽然使用完全限定的表单进行单个读取或写入会更快,但如果使用global进行多次访问,则总是会更快,并且使用global call中的多个变量,效果会变得更强,因为一些成本是可摊销的

但不要相信我的话。制作一些示例程序,并随时间为自己进行测试,可能如下所示:

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,但数据并没有撒谎。

从程序员的角度看,没有任何区别。你想对解释器/字节码进行多深的研究?从编码人员的角度来看,根本没有区别。您想深入到解释器/字节码的深度?您可能还看到了跟踪中的差异,InfoFrame肯定也能看到差异,尽管这只是一个调试工具。您可能还看到了跟踪中的差异,InfoFrame肯定也能看到差异,尽管这只是一个调试工具。