我正在使用EDA SW。它需要我依赖全局变量。 说我有一个proc,我正在寻找一个全局变量CCK_FOO。我有两个选择:
global CCK_FOO
。::CCK_FOO
就“管理水平”而言,这些看似相同。对于这两种方法中是否存在“引擎盖下”的赞成和反对?我实际上更喜欢使用::
,因为它最大限度地减少了意外覆盖的可能性。
答案 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)
});
});
获得了相当多的加速。