github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/redis/bench.go (about) 1 // Copyright 2014 <chaishushan{AT}gmail.com>. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build ingore 6 7 package main 8 9 import ( 10 "flag" 11 "fmt" 12 "os" 13 "runtime/pprof" 14 "time" 15 16 "chai2010.gopkg/database/redis" 17 ) 18 19 var requests *int = flag.Int("n", 10000, "number of request") 20 var dsize *int = flag.Int("d", 3, "data size") 21 var cpuprof *string = flag.String("cpuprof", "", "filename for cpuprof") 22 var database *int = flag.Int("b", 8, "database used for testing (WILL BE FLUSHED!)") 23 24 func errHndlr(err error) { 25 if err != nil { 26 fmt.Println("error:", err) 27 os.Exit(1) 28 } 29 } 30 31 // benchmark benchmarks the given command with the given parameters 32 // and displays the given test name. 33 func benchmark(c *redis.Client, testname string, command string, params ...interface{}) { 34 fmt.Printf("===== %s =====\n", testname) 35 start := time.Now() 36 37 for i := 0; i < *requests; i++ { 38 c.Cmd(command, params...) 39 } 40 41 duration := time.Now().Sub(start) 42 rps := float64(*requests) / duration.Seconds() 43 fmt.Println("Requests per second:", rps) 44 fmt.Printf("Duration: %v\n\n", duration.Seconds()) 45 } 46 47 func testIsSelected(args []string, name string) bool { 48 for _, v := range args { 49 if name == v { 50 return true 51 } 52 } 53 return false 54 } 55 56 func main() { 57 var data string 58 59 flag.Parse() 60 // minimum amount of requests 61 if *requests < 1000 { 62 *requests = 1000 63 } 64 65 if *cpuprof != "" { 66 f, err := os.Create(*cpuprof) 67 if err != nil { 68 fmt.Println(err) 69 return 70 } 71 72 pprof.StartCPUProfile(f) 73 defer pprof.StopCPUProfile() 74 } 75 76 for i := 0; i < *dsize; i++ { 77 data += "x" 78 } 79 80 c, err := redis.Dial("tcp", "127.0.0.1:6379") 81 errHndlr(err) 82 83 // select database 84 r := c.Cmd("select", *database) 85 errHndlr(err) 86 87 r = c.Cmd("flushdb") 88 errHndlr(r.Err) 89 90 fmt.Printf( 91 "Requests: %d, Payload: %d byte \n\n", 92 *requests, 93 *dsize) 94 95 args := flag.Args() 96 if len(args) == 0 { 97 // run all tests by default 98 args = []string{ 99 "ping", 100 "set", 101 "get", 102 "incr", 103 "lpush", 104 "lpop", 105 "sadd", 106 "spop", 107 "lrange", 108 "lrange_100", 109 "lrange_300", 110 "lrange_450", 111 "lrange_600", 112 "mset", 113 } 114 } 115 116 if testIsSelected(args, "ping") { 117 benchmark(c, "PING", "ping") 118 } 119 if testIsSelected(args, "set") { 120 benchmark(c, "SET", "set", "foo:rand:000000000000", data) 121 } 122 if testIsSelected(args, "get") { 123 benchmark(c, "GET", "get", "foo:rand:000000000000") 124 } 125 if testIsSelected(args, "incr") { 126 benchmark(c, "INCR", "incr", "counter:rand:000000000000") 127 } 128 if testIsSelected(args, "lpush") { 129 benchmark(c, "LPUSH", "lpush", "mylist", data) 130 } 131 if testIsSelected(args, "lpop") { 132 benchmark(c, "LPOP", "lpop", "mylist") 133 } 134 if testIsSelected(args, "sadd") { 135 benchmark(c, "SADD", "sadd", "myset", "counter:rand:000000000000") 136 } 137 if testIsSelected(args, "spop") { 138 benchmark(c, "SPOP", "spop", "myset") 139 } 140 if testIsSelected(args, "lrange") || 141 testIsSelected(args, "lrange_100") || 142 testIsSelected(args, "lrange_300") || 143 testIsSelected(args, "lrange_450") || 144 testIsSelected(args, "lrange_600") { 145 benchmark(c, "LPUSH (needed to benchmark LRANGE)", "lpush", "mylist", data) 146 } 147 if testIsSelected(args, "lrange") || testIsSelected(args, "lrange_100") { 148 benchmark(c, "LRANGE_100", "lrange", "mylist", 0, 99) 149 } 150 if testIsSelected(args, "lrange") || testIsSelected(args, "lrange_300") { 151 benchmark(c, "LRANGE_300", "lrange", "mylist", 0, 299) 152 } 153 if testIsSelected(args, "lrange") || testIsSelected(args, "lrange_450") { 154 benchmark(c, "LRANGE_450", "lrange", "mylist", 0, 449) 155 } 156 if testIsSelected(args, "lrange") || testIsSelected(args, "lrange_600") { 157 benchmark(c, "LRANGE_600", "lrange", "mylist", 0, 599) 158 } 159 if testIsSelected(args, "mset") { 160 args := make([]interface{}, 20) 161 for i := 0; i < 20; i += 2 { 162 args[i] = "foo:rand:000000000000" 163 args[i+1] = data 164 } 165 benchmark(c, "MSET", "mset", args...) 166 } 167 168 r = c.Cmd("flushdb") 169 errHndlr(r.Err) 170 }