我正在研究在包含if和else块的单个命令中使用三元运算符优化现有代码执行的可能性。
三元运算符的方法是否比传统的if / else方法更快,这样可以更快地执行以下操作:
首先:
expr {[info exists arr($var)]? [return $_timeouts($var)] : [puts "No key $var has been set"]}
第二
if {[info exists arr($var)]} {
[return $_timeouts($var)]
} else {
puts "No key $var has been set"
}
请注意,三元运算符方法(第一个)中的整个expr包含在单个{}块中,我希望这比第二个方法更快。
由于
答案 0 :(得分:4)
您可以使用内置的time命令来测试您的问题。
我将'puts'更改为不同的'return'语句,以便可以将数组中存在的变量的速度直接与数组中不存在的变量的速度进行比较。
variable arr
proc test1 { var } {
variable arr
expr {[info exists arr($var)] ? [return $arr($var)] : [return -1]}
}
proc test2 { var } {
variable arr
if { [info exists arr($var)] } {
return $arr($var)
} else {
return -1
}
}
proc init { } {
variable arr
# fill arr with stuff...
for {set i 0} {$i < 10000} {incr i} {
set arr($i) $i
}
}
init
puts [time {test1 9000} 10000]
puts [time {test1 15000} 10000]
puts [time {test2 9000} 10000]
puts [time {test2 15000} 10000]
我机器上的结果:
bll-tecra:bll$ tclsh t.tcl
1.3121 microseconds per iteration
1.0267 microseconds per iteration
1.1399 microseconds per iteration
0.9029 microseconds per iteration
因此使用expr会慢一点。在这种情况下,更易读的代码绝对是一个胜利。
速度差异非常小。如果这个小差异正在影响您的程序,我还建议使用字典而不是数组来尝试此代码,并检查速度差异。