Posted to tcl by used____ at Sun Jun 12 10:12:14 GMT 2022view pretty
# test speed of dict vs array access vs switch
namespace eval ::ns {
variable arr
variable dic
proc init {{n 100}} {
variable arr
variable dic
catch {array unset arr}
catch {unset dic}
set dic [dict create]
array set arr {}
set ps "proc ::ns::tests {{n 100}} {\n for {set i 0} {\$i < \$n} {incr i} {\n switch -exact \$i {"
for {set i 0} {$i < $n} {incr i} {
set v "v$i"
set arr($i) $v
dict append dic $i $v
append ps "\n $i {set x $i}"
}
append ps "\n }\n }\n}\n"
eval $ps
}
proc test0 {{n 100}} {
for {set i 0} {$i < $n} {incr i} {
}
}
proc testa {{n 100}} {
variable arr
for {set i 0} {$i < $n} {incr i} {
set x $arr($i)
}
}
proc testd {{n 100}} {
variable dic
for {set i 0} {$i < $n} {incr i} {
set x [dict get $dic $i]
}
}
}
### tests
set N 1000
::ns::init $N
puts "speed comparison array get/dict get/switch; by used___; version: 0"
puts "init: $N entries"; ::ns::init $N
puts "overhead: ::ns::test0 [time ::ns::test0 $N]"
puts "array get: ::ns::testa [time ::ns::testa $N]"
puts "dict get: ::ns::testd [time ::ns::testd $N]"
puts "switch: ::ns::tests [time ::ns::tests $N]"