123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/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
|