Tcl 执行什么更快-expr或if

Tcl 执行什么更快-expr或if,tcl,Tcl,我正在研究在包含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)]

我正在研究在包含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包含在单个{}块中,我希望这将比第二种方法执行得更快

谢谢

您可以使用内置命令测试您的问题

我将“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]
所以使用expr稍微慢一点。在这种情况下,更具可读性的代码肯定是一个胜利

速度差很小。如果这个微小的差异影响了您的程序,我还建议您使用字典而不是数组来尝试这段代码,并检查速度差异。

您可以使用内置命令来测试您的问题

我将“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]
所以使用expr稍微慢一点。在这种情况下,更具可读性的代码肯定是一个胜利


速度差很小。如果这个微小的差异影响了您的程序,我也建议您使用字典而不是数组来尝试这段代码,并检查速度差异。

If变体中有一个错误:true子句的大括号内不应该有括号。修正后,两个变量被编译成几乎相同的字节码(在这两种情况下,选择结构被替换为跳转),最显著的区别是
expr
变量必须在终止之前执行
tryCvtToNumeric
,很可能会花费一些执行时间。执行时间差异很小,这在很大程度上取决于Tcl的确切补丁级别。这里有一些微妙之处,其中
tryCvtToNumeric
只是其中之一。但是,除非你已经证明这是一个瓶颈,否则就不值得担心了。
if
变体中有一个错误:true子句的大括号内不应该有括号。修正后,两个变量被编译成几乎相同的字节码(在这两种情况下,选择结构被替换为跳转),最显著的区别是
expr
变量必须在终止之前执行
tryCvtToNumeric
,很可能会花费一些执行时间。执行时间差异很小,这在很大程度上取决于Tcl的确切补丁级别。这里有一些微妙之处,其中
tryCvtToNumeric
只是其中之一。但这真的不值得担心,除非你已经证明这是一个瓶颈。