valkey/utils/speed-regression.tcl

91 lines
2.6 KiB
Tcl
Raw Normal View History

#!/usr/bin/env tclsh8.5
# Copyright (C) 2011 Salvatore Sanfilippo
# Released under the BSD license like Redis itself
proc run-tests branches {
set runs {}
set branch_id 0
foreach b $branches {
cd ../src
puts "Benchmarking $b"
exec -ignorestderr git checkout $b 2> /dev/null
exec -ignorestderr make clean 2> /dev/null
puts " compiling..."
exec -ignorestderr make 2> /dev/null
if {$branch_id == 0} {
puts " copy redis-benchmark from unstable to /tmp..."
exec -ignorestderr cp ./redis-benchmark /tmp
incr branch_id
continue
}
# Start the Redis server
puts " starting the server... [exec ./redis-server -v]"
set pids [exec echo "port 12123\nloglevel warning\n" | ./redis-server - > /dev/null 2> /dev/null &]
after 1000
puts " running the benchmark"
set output [exec /tmp/redis-benchmark -n 100000 --csv -p 12123]
lappend runs $b $output
puts " killing server..."
catch {
exec kill -9 [lindex $pids 0]
exec kill -9 [lindex $pids 1]
}
incr branch_id
}
return $runs
}
proc get-result-with-name {output name} {
foreach line [split $output "\n"] {
lassign [split $line ","] key value
set key [string tolower [string range $key 1 end-1]]
set value [string range $value 1 end-1]
if {$key eq [string tolower $name]} {
return $value
}
}
return "n/a"
}
proc get-test-names output {
set names {}
foreach line [split $output "\n"] {
lassign [split $line ","] key value
set key [string tolower [string range $key 1 end-1]]
lappend names $key
}
return $names
}
proc combine-results {results} {
set tests [get-test-names [lindex $results 1]]
foreach test $tests {
puts $test
foreach {branch output} $results {
puts [format "%-20s %s" \
$branch [get-result-with-name $output $test]]
}
puts {}
}
}
proc main {} {
# Note: the first branch is only used in order to get the redis-benchmark
# executable. Tests are performed starting from the second branch.
set branches {
slowset 2.2.0 2.4.0 unstable slowset
}
set results [run-tests $branches]
puts [combine-results $results]
}
# Force the user to run the script from the 'utils' directory.
if {![file exists speed-regression.tcl]} {
puts "Please make sure to run speed-regression.tcl while inside /utils."
puts "Example: cd utils; ./speed-regression.tcl"
exit 1
}
main