131 lines
3.7 KiB
Tcl
Executable File
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
|