read-redis/utils/speed-regression.tcl

131 lines
3.7 KiB
Tcl
Executable File

#!/usr/bin/env tclsh8.5
# Copyright (C) 2011 Salvatore Sanfilippo
# Released under the BSD license like Redis itself
source ../tests/support/redis.tcl
set ::port 12123
set ::tests {PING,SET,GET,INCR,LPUSH,LPOP,SADD,SPOP,LRANGE_100,LRANGE_600,MSET}
set ::datasize 16
set ::requests 100000
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 $::port\nloglevel warning\n" | ./redis-server - > /dev/null 2> /dev/null &]
puts " pids: $pids"
after 1000
puts " running the benchmark"
set r [redis 127.0.0.1 $::port]
set i [$r info]
puts " redis INFO shows version: [lindex [split $i] 0]"
$r close
set output [exec /tmp/redis-benchmark -n $::requests -t $::tests -d $::datasize --csv -p $::port]
lappend runs $b $output
puts " killing server..."
catch {exec kill -9 [lindex $pids 0]}
catch {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 "\n"
puts "# Test results: datasize=$::datasize requests=$::requests"
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
}
# Make sure there is not already a server runnign on port 12123
set is_not_running [catch {set r [redis 127.0.0.1 $::port]}]
if {!$is_not_running} {
puts "Sorry, you have a running server on port $::port"
exit 1
}
# parse arguments
for {set j 0} {$j < [llength $argv]} {incr j} {
set opt [lindex $argv $j]
set arg [lindex $argv [expr $j+1]]
if {$opt eq {--tests}} {
set ::tests $arg
incr j
} elseif {$opt eq {--datasize}} {
set ::datasize $arg
incr j
} elseif {$opt eq {--requests}} {
set ::requests $arg
incr j
} else {
puts "Wrong argument: $opt"
exit 1
}
}
main