gpt4 book ai didi

tcl - Global 和::in TCL 有什么区别?

转载 作者:行者123 更新时间:2023-12-02 04:09:53 25 4
gpt4 key购买 nike

我正在使用 EDA 软件。它要求我依赖全局变量。假设我有一个进程,我正在寻找一个全局变量 CCK_FOO。我有两个选择:

  1. 在代码中使用全局 CCK_FOO
  2. 使用::CCK_FOO

就“管理级别”而言,它们看起来是相同的。这两种方法是否有“幕后”的优点和缺点?我实际上更喜欢使用 ::,因为它可以最大限度地减少意外覆盖的可能性。

最佳答案

在底层,使用 ::CCK_FOO 会在执行引擎每次使用它时遍历解析的变量名称路由,而 global CCK_FOO 允许引擎设置一个链接到全局变量的局部变量(带有局部变量表 - LVT - 槽)。通过 LVT 访问要快得多,因为这只是 C 数组的索引(以及额外的指针取消引用,因为它是链接),而查找全局变量意味着进行哈希表查找(全局命名空间中的变量有一个哈希表)执行)。 ::CCK_FOO 实际内部解析为 ::CCK_FOO 被缓存。

实际上,如果您只访问一个变量一次,那么使用 ::CCK_FOO 可能稍微更快,但是一旦您使用它两次(更不用说更多)您可以通过支付全局 CCK_FOO 的额外成本并通过 LVT 索引访问它来获得更好的性能。

% 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

请注意,上面的代码和下面的代码之间的时间不具有可比性,因为它们执行的其他工作量不同。请查看 style1style2 之间的时间差异。

% 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

正如您所看到的,只需两次访问,通过使用全局,我们获得了相当多的加速。

关于tcl - Global 和::in TCL 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com