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