首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl和uplevel的性能

Tcl和uplevel的性能
EN

Stack Overflow用户
提问于 2021-06-17 11:52:30
回答 2查看 190关注 0票数 0

假设我有一个变量,它是一个级别上的变量,我只想查询它的值。我有两个选择:

uplevel { set var_name }

或者:

upvar var_name

如果我只需要查询变量一次,而不是修改它,那么哪个应该更快?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-17 12:08:02

您会发现upvar在这方面可能更快。不一定,但很有可能。(如果你担心性能问题,那就选择time吧。)请注意,它们都必须解析变量名;这是无论如何都要承担的费用。但是带有upvar的版本并不涉及在上下文之间移动代码,所以它可能会更快。

FWIW,当我尝试下面的例子时,我的直觉是正确的。(关键是其中一个使用upvar字节码操作代码;另一个使用invokeStk,这比较慢,因为这是通用命令dispatcher,并且有许多其他用途所必需的开销。)

代码语言:javascript
复制
% proc foo {y} {set x 1; bar $y}
% proc bar {y} {upvar 1 x x; list $x $y}
% foo 2
1 2
% time {foo 2} 10000
17.8188412 microseconds per iteration
% proc bar {y} {set x [uplevel 1 {set x}]; list $x $y}
% foo 2
1 2
% time {foo 2} 10000
25.4614022 microseconds per iteration
票数 3
EN

Stack Overflow用户

发布于 2021-06-18 09:36:15

对于这种微型基准测试,我更喜欢timerate

代码语言:javascript
复制
% namespace import ::tcl::unsupported::timerate
% timerate -calibrate {}
0.03257451263357219 µs/#-overhead 0.032807 µs/# 59499506 # 30481304 #/sec
% proc foo {y} {set x 1; bar $y}
% proc bar {y} {upvar 1 x x; list $x $y}
% timerate {foo 2} 10000
0.437240 µs/# 21285016 # 2287075 #/sec 9306.651 net-ms
% proc bar {y} {set x [uplevel 1 {set x}]; list $x $y}
% timerate {foo 2} 10000
0.612693 µs/# 15497439 # 1632137 #/sec 9495.179 net-ms

(答案是肯定的:使用upvar)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68018789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档