Posted to tcl by pooryorick at Fri Oct 14 02:30:33 GMT 2016view raw
- 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