Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/csv"
- "fmt"
- "github.com/fsouza/gokabinet/kc"
- "log"
- "math/rand"
- "os"
- "runtime"
- "time"
- )
- const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 abcdefghijklmnopqrstuvwxyz" +
- "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:`"
- const Maxlen = 1024
- func RandStrings(N int) []string {
- r := make([]string, N)
- ri := 0
- buf := make([]byte, Maxlen)
- known := map[string]bool{}
- for i := 0; i < N; i++ {
- retry:
- l := rand.Intn(Maxlen)
- for j := 0; j < l; j++ {
- buf[j] = chars[rand.Intn(len(chars))]
- }
- s := string(buf[0:l])
- if known[s] {
- goto retry
- }
- known[s] = true
- r[ri] = s
- ri++
- }
- return r
- }
- func save_csv(num int, sec float64, dbtype string) {
- file, _ := os.OpenFile(fmt.Sprintf("bench_%s.csv", dbtype), os.O_CREATE|os.O_APPEND|os.O_RDWR, 0664)
- defer file.Close()
- writer := csv.NewWriter(file)
- record := []string{fmt.Sprintf("%d", num), fmt.Sprintf("%f", sec), dbtype}
- writer.Write(record)
- writer.Flush()
- }
- func timeTrack(start time.Time, name string, num int, dbtype string) {
- elapsed := time.Since(start)
- fmt.Println(name, elapsed, "throughput:", int64(float64(num)/(elapsed.Seconds())), "/sec\n")
- save_csv(num, elapsed.Seconds(), dbtype)
- }
- func runbench(t string, n int) {
- p := fmt.Sprintf("./cache_%d.kc%s", n, t)
- fmt.Println(p)
- defer timeTrack(time.Now(), fmt.Sprintf("%d records, type %s", n, t), n, t)
- db, err := kc.Open(p, kc.WRITE)
- if err != nil {
- log.Fatal(err)
- }
- defer db.Close()
- for i := 0; i < n; i++ {
- r := RandStrings(2)
- k := r[0]
- v := r[1]
- db.Set(k, v)
- }
- os.Remove(p)
- }
- func main() {
- fmt.Println("Generated string length:", Maxlen)
- iter := 64000000
- incr := 1000
- for i := incr; i < iter+1; i = incr {
- //runbench("h", i)
- runbench("t", i)
- runtime.GC()
- incr = 2 * i
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement