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]"