TCL中global和::有什么区别?

时间:2016-05-18 09:33:38

标签: tcl

我正在使用EDA SW。它需要我依赖全局变量。 说我有一个proc,我正在寻找一个全局变量CCK_FOO。我有两个选择:

  1. 在代码中使用global CCK_FOO
  2. 使用::CCK_FOO
  3. 就“管理水平”而言,这些看似相同。对于这两种方法中是否存在“引擎盖下”的赞成和反对?我实际上更喜欢使用::,因为它最大限度地减少了意外覆盖的可能性。

1 个答案:

答案 0 :(得分:4)

在引擎盖下,每次执行引擎使用::CCK_FOO时,使用global CCK_FOO都会通过解析后的变量名称路由,而::CCK_FOO允许引擎设置局部变量(使用局部变量表 - LVT - slot)链接到全局变量。通过LVT进行访问要快得多,因为它只是C数组的索引(以及额外的指针取消引用,因为它是链接),而查找全局变量则意味着进行哈希表查找(那里&#39) ;全局命名空间实现中变量的哈希表)。 ::CCK_FOO::CCK_FOO的实际内部解析被缓存。

实际上,如果您只访问变量一次,但是只要您使用两次变量,那么使用global CCK_FOO可能稍微更快 )通过支付% proc style1 {} { set ::CCK_FOO abc } % proc style2 {} { global CCK_FOO set CCK_FOO abc } % time { style1 } 100000 0.52350635 microseconds per iteration % time { style2 } 100000 0.5267007100000001 microseconds per iteration 的额外费用并通过LVT索引访问它,您可以获得更好的性能。

style1

请注意,上面的代码和下面的代码之间的时间不可比,因为它们执行不同数量的其他工作。请注意style2% proc style1 {} { set ::CCK_FOO [string reverse $::CCK_FOO] } % proc style2 {} { global CCK_FOO set CCK_FOO [string reverse $CCK_FOO] } % time { style1 } 100000 0.9733970200000001 microseconds per iteration % time { style2 } 100000 0.78782093 microseconds per iteration # Calibration... % time { string reverse abc } 100000 0.28694849 microseconds per iteration 之间的时间差异。

global

正如您所看到的,只有两次访问,我们通过使用$( document ).ready(function() { var newArray= new Array(); $('.sal').click(function() { newArray.push($(this).val()); alert("newArray contents = "+ newArray) }); });获得了相当多的加速。