Posted to tcl by pooryorick at Fri Oct 14 02:30:33 GMT 2016view pretty
namespace import ::tcl::mathfunc::round package require struct::list package require struct::set proc + {a b} {expr {$a + $b}} proc benchmark { {cmd1 cmd1} {cmd2 cmd2} {times 1000} {n1 "Command 1"} {n2 "Command 2"} } { set result " Benchmark: ------------------ $n1: [info body $cmd1] $n2: [info body $cmd2] Results: ------------------ " set r0 [time {set times} 1000] set r1 [lindex [ time $cmd1 $times ] 0] set r2 [lindex [ time $cmd2 $times ] 0] set r3 [lindex [ time $cmd2 $times ] 0] set r4 [lindex [ time $cmd1 $times ] 0] set r5 [lindex [ time $cmd1 $times ] 0] set r6 [lindex [ time $cmd2 $times ] 0] set r7 [lindex [ time $cmd1 $times ] 0] set r8 [lindex [ time $cmd2 $times ] 0] set r0 [lindex [ time $cmd1 1000 ] 0] set r0 [lindex [ time $cmd2 1000 ] 0] set 1 [list $r1 $r4 $r5 $r7] set 2 [list $r2 $r3 $r6 $r8] set 1sum [::struct::list fold $1 0 +] set 2sum [::struct::list fold $2 0 +] set 1avg [round [expr { $1sum / [llength $1] }]] set 2avg [round [expr { $2sum / [llength $2] }]] set iterations1 [expr { $times * [llength $1] }] set iterations2 [expr { $times * [llength $2] }] set fsum1 [expr { $1avg * $iterations1 }] set fsum2 [expr { $2avg * $iterations2 }] set fsum1ms [expr { round($fsum1 / 1000) }] set fsum2ms [expr { round($fsum2 / 1000) }] append result "\n Tests: $n1 : $1 $n2 : $2 " append result "\n Summary: Average: $1avg vs $2avg Duration (MS): $fsum1ms vs $fsum2ms Duration (Micro): $fsum1 vs $fsum2 " if { $1avg > $2avg } { set by [expr { $1avg - $2avg }] set winner "2" set win $2avg set lose [expr {$1avg + .0000000000001}] set name $n2 } else { set winner "1" set win $1avg set lose [expr {$2avg + .0000000000001}] set by [expr { $2avg - $1avg }] set name $n1 } set pct [expr { ( 1 - ( double($win) / $lose ) ) * 100 }] set sum [expr { round( ($by * $iterations1) / 1000 )}] append result "\n\n Winner: Command $winner (${name}) Iterations: $iterations1 Wins By: $by microseconds per iteration Overall Faster By: $sum milliseconds Faster by %: $pct ------------------ " puts $result puts [expr { $1sum }] return [list $winner $sum] } proc cmd1 {} { for {set i 0} {$i < 10000} {incr i} { incr a } } proc cmd2 {} { for {set i 0} {$i < 10000} {incr i} { incr a } } b