Posted to tcl by dbohdan at Mon Jun 12 10:19:51 GMT 2017view pretty
namespace eval ::poly { namespace export * proc index {value args} { ::poly::[lindex $value 0]::index $value {*}$args } proc length value { ::poly::[lindex $value 0]::length $value } } namespace eval ::poly::LIST { proc index {value args} { return [lindex [lindex $value 1] {*}$args] } proc length value { return [llength [lindex $value 1]] } } namespace eval ::poly::DICT { proc index {value args} { return [dict get [lindex $value 1] {*}$args] } proc length {value args} { return [dict size [lindex $value 1]] } } namespace eval ::benchmark { namespace import ::poly::* } set testValues {} for {set i 0} {$i < 10000} {incr i} { set tag [expr {$i % 2 == 0 ? "LIST" : "DICT"}] lappend testValues [list $tag [list foo$i bar$i baz$i qux$i hi yo]] } proc ::benchmark::bench1 values { set result {} foreach value $values { set tag [lindex $value 0] set content [lindex $value 1] if {$tag == {LIST}} { lappend result [llength $content] } else { lappend result [dict size $content] } } return $result } proc ::benchmark::bench2 values { set result {} foreach value $values { lappend result [length $value] } return $result } puts [time {::benchmark::bench1 $testValues} 100] puts [time {::benchmark::bench2 $testValues} 100]