双冒号和全局变量之间的区别使用?

时间:2017-01-11 13:20:48

标签: tcl

最近我发现了namespace概念以及对程序变量使用双冒号(::)。

在开始重塑我的所有脚本之前,我想知道使用global关键字和双冒号语法访问变量之间是否存在真正的区别。
例如
    set var bla
    proc kuku {} { puts $::var }

VS。
proc gaga {} {global var ; puts $var}

在这两种情况下,我都会得到“反对”。写在我的屏幕上。

我缺少什么?
我理解编辑变量会有点问题(甚至可能吗?),但对于只读变量,这两种方法有区别吗?

1 个答案:

答案 0 :(得分:2)

他们在谈论同一个变量。使用::var表单,您使用的是完全限定名称,而使用带有global的表单,您将创建一个指向全局变量的本地链接(真正是指向全局变量的指针。无论您选择哪种方式,阅读或写作都应该完全相同。

两者之间存在可衡量的差异。使用global,您将获得设置链接的额外成本,但此后在剩余的程序中,每次使用的成本(读取或写入)要低得多。使用另一种形式,您不需要支付任何设置开销,但每次使用成本更高。仅供一次使用,两者的成本非常相似。如果您多次使用该变量,global会更便宜。 OTOH,有时使用完全限定版本更清楚(尽管速度降低,但vwaittrace尤其如此)。

我发现我使用完全限定的表单访问::env::tcl_platform数组,但大多数其他内容将通过global访问。这只是我的偏好。

以下是交互式会话示例:

% set x 1
1
% proc y1 {} {incr ::x;return ok}
% time { y1 } 10000
0.5398216 microseconds per iteration
% proc y2 {} {global x;incr x;return ok}
% time { y2 } 10000
0.4537753 microseconds per iteration
% proc z1 {} {return $::x}
% time { z1 } 10000
0.4864713 microseconds per iteration
% proc z2 {} {global x; return $x}
% time { z2 } 10000
0.4433554 microseconds per iteration

(我不希望你得到和我一样的绝对数字。做你自己的性能测试。我希望有类似的相对数字......)