我正在使用 EDA 软件。它要求我依赖全局变量。假设我有一个进程,我正在寻找一个全局变量 CCK_FOO。我有2个选择:
global CCK_FOO在代码中使用。::CCK_FOO就“管理水平”而言,这些看起来是相同的。这两种方法是否有“幕后”的优点和缺点?我实际上更喜欢使用::,因为它可以最大限度地减少意外覆盖的可能性。
在底层,::CCK_FOO每次执行引擎使用它时,using 都会遍历解析的变量名称路径,而global CCK_FOO允许引擎设置一个局部变量(使用局部变量表 \xe2\x80\x94 LVT \xe2\x80\x94 插槽) 链接到全局变量。通过 LVT 访问要快得多,因为这只是 C 数组的索引(以及额外的指针取消引用,因为它是链接),而查找全局变量意味着进行哈希表查找(全局命名空间中的变量有一个哈希表)执行)。::CCK_FOOinto::和的实际内部解析CCK_FOO被缓存。
实际上,如果您只访问一个变量一次,那么使用它可能会稍微::CCK_FOO快一些,但是一旦您使用它两次(更不用说更多),您可以通过支付额外的成本global CCK_FOO并通过 LVT 索引访问它来获得更好的性能。
% proc style1 {} {\n set ::CCK_FOO abc\n}\n% proc style2 {} {\n global CCK_FOO\n set CCK_FOO abc\n}\n% time { style1 } 100000\n0.52350635 microseconds per iteration\n% time { style2 } 100000\n0.5267007100000001 microseconds per iteration\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,上面的代码和下面的代码之间的时间不具有可比性,因为它们执行的其他工作量不同。style1相反,请查看和之间的时间差异style2。
% proc style1 {} {\n set ::CCK_FOO [string reverse $::CCK_FOO]\n}\n% proc style2 {} {\n global CCK_FOO\n set CCK_FOO [string reverse $CCK_FOO]\n}\n% time { style1 } 100000\n0.9733970200000001 microseconds per iteration\n% time { style2 } 100000\n0.78782093 microseconds per iteration\n# Calibration...\n% time { string reverse abc } 100000\n0.28694849 microseconds per iteration\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,只需两次访问,我们就可以通过使用global.
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |