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  }