Tclで科学技術計算をする時に、リストに入っているデータから最大値を求めたい時がありますよね。expr max($l) で出来そうなのですが、max関数は引数が,区切りで無いと受け付けてくれません。そこで、全データを調べる方法と、ソートする方法、区切り文字を変えてmax関数を使う方法で、どれが一番速いかを試しました。
max.tcl
# テストデータの作成
set l ""
for {set i 0} { $i<1000000 } {incr i} {
lappend l [expr rand()]
}
# 方法1 自力で比較
set s0 [clock clicks -milliseconds]
set max [lindex $l 0]
foreach x $l {
if { $max < $x } {
set max $x
}
}
set s1 [clock clicks -milliseconds]
puts "1: max $max time [expr $s1 - $s0] ms"
# 方法2 ソートを使う
set s0 [clock clicks -milliseconds]
set max [lindex [lsort -decreasing -real $l] 0]
set s1 [clock clicks -milliseconds]
puts "2: max $max time [expr $s1 - $s0] ms"
# 方法3 区切りを変えてmax関数を使う
set s0 [clock clicks -milliseconds]
set max [expr max([regsub -all { } $l {,}])]
set s1 [clock clicks -milliseconds]
puts "3: max $max time [expr $s1 - $s0] ms"
実行するとこのようになります。
1: max 0.9999997345730661 time 339 ms
2: max 0.9999997345730661 time 419 ms
3: max 0.9999997345730661 time 4978 ms
区切り文字を変えて組込のmax関数が速いと思ったのですが、自分で計算する方が速いですね。