xref: /redis-3.2.3/utils/speed-regression.tcl (revision d5a80182)
1#!/usr/bin/env tclsh8.5
2# Copyright (C) 2011 Salvatore Sanfilippo
3# Released under the BSD license like Redis itself
4
5source ../tests/support/redis.tcl
6set ::port 12123
7set ::tests {PING,SET,GET,INCR,LPUSH,LPOP,SADD,SPOP,LRANGE_100,LRANGE_600,MSET}
8set ::datasize 16
9set ::requests 100000
10
11proc run-tests branches {
12    set runs {}
13    set branch_id 0
14    foreach b $branches {
15        cd ../src
16        puts "Benchmarking $b"
17        exec -ignorestderr git checkout $b 2> /dev/null
18        exec -ignorestderr make clean 2> /dev/null
19        puts "  compiling..."
20        exec -ignorestderr make 2> /dev/null
21
22        if {$branch_id == 0} {
23            puts "  copy redis-benchmark from unstable to /tmp..."
24            exec -ignorestderr cp ./redis-benchmark /tmp
25            incr branch_id
26            continue
27        }
28
29        # Start the Redis server
30        puts "  starting the server... [exec ./redis-server -v]"
31        set pids [exec echo "port $::port\nloglevel warning\n" | ./redis-server - > /dev/null 2> /dev/null &]
32        puts "  pids: $pids"
33        after 1000
34        puts "  running the benchmark"
35
36        set r [redis 127.0.0.1 $::port]
37        set i [$r info]
38        puts "  redis INFO shows version: [lindex [split $i] 0]"
39        $r close
40
41        set output [exec /tmp/redis-benchmark -n $::requests -t $::tests -d $::datasize --csv -p $::port]
42        lappend runs $b $output
43        puts "  killing server..."
44        catch {exec kill -9 [lindex $pids 0]}
45        catch {exec kill -9 [lindex $pids 1]}
46        incr branch_id
47    }
48    return $runs
49}
50
51proc get-result-with-name {output name} {
52    foreach line [split $output "\n"] {
53        lassign [split $line ","] key value
54        set key [string tolower [string range $key 1 end-1]]
55        set value [string range $value 1 end-1]
56        if {$key eq [string tolower $name]} {
57            return $value
58        }
59    }
60    return "n/a"
61}
62
63proc get-test-names output {
64    set names {}
65    foreach line [split $output "\n"] {
66        lassign [split $line ","] key value
67        set key [string tolower [string range $key 1 end-1]]
68        lappend names $key
69    }
70    return $names
71}
72
73proc combine-results {results} {
74    set tests [get-test-names [lindex $results 1]]
75    foreach test $tests {
76        puts $test
77        foreach {branch output} $results {
78            puts [format "%-20s %s" \
79                $branch [get-result-with-name $output $test]]
80        }
81        puts {}
82    }
83}
84
85proc main {} {
86    # Note: the first branch is only used in order to get the redis-benchmark
87    # executable. Tests are performed starting from the second branch.
88    set branches {
89        slowset 2.2.0 2.4.0 unstable slowset
90    }
91    set results [run-tests $branches]
92    puts "\n"
93    puts "# Test results: datasize=$::datasize requests=$::requests"
94    puts [combine-results $results]
95}
96
97# Force the user to run the script from the 'utils' directory.
98if {![file exists speed-regression.tcl]} {
99    puts "Please make sure to run speed-regression.tcl while inside /utils."
100    puts "Example: cd utils; ./speed-regression.tcl"
101    exit 1
102}
103
104# Make sure there is not already a server runnign on port 12123
105set is_not_running [catch {set r [redis 127.0.0.1 $::port]}]
106if {!$is_not_running} {
107    puts "Sorry, you have a running server on port $::port"
108    exit 1
109}
110
111# parse arguments
112for {set j 0} {$j < [llength $argv]} {incr j} {
113    set opt [lindex $argv $j]
114    set arg [lindex $argv [expr $j+1]]
115    if {$opt eq {--tests}} {
116        set ::tests $arg
117        incr j
118    } elseif {$opt eq {--datasize}} {
119        set ::datasize $arg
120        incr j
121    } elseif {$opt eq {--requests}} {
122        set ::requests $arg
123        incr j
124    } else {
125        puts "Wrong argument: $opt"
126        exit 1
127    }
128}
129
130main
131