Browse Source

add benchmarks

Xiang Li 12 years ago
parent
commit
39fa2eb4ee
5 changed files with 164 additions and 29 deletions
  1. 9 2
      store/store.go
  2. 76 4
      store/store_test.go
  3. 1 1
      store/tree.go
  4. 76 9
      store/tree_store_test.go
  5. 2 13
      store/watcher_test.go

+ 9 - 2
store/store.go

@@ -317,16 +317,23 @@ func (s *Store) RawGet(key string) ([]*Response, error) {
 
 
 			var TTL int64
 			var TTL int64
 			var isExpire bool = false
 			var isExpire bool = false
+			var thisKey string
 
 
 			isExpire = !nodes[i].ExpireTime.Equal(PERMANENT)
 			isExpire = !nodes[i].ExpireTime.Equal(PERMANENT)
 
 
+			if keys != nil {
+				thisKey = path.Join(key, keys[i])
+			} else {
+				thisKey = key
+			}
+
 			resps[i] = &Response{
 			resps[i] = &Response{
 				Action: "GET",
 				Action: "GET",
 				Index:  s.Index,
 				Index:  s.Index,
-				Key:    path.Join(key, keys[i]),
+				Key:    thisKey,
 			}
 			}
 
 
-			if !dirs[i] {
+			if dirs == nil || !dirs[i] {
 				resps[i].Value = nodes[i].Value
 				resps[i].Value = nodes[i].Value
 			} else {
 			} else {
 				resps[i].Dir = true
 				resps[i].Dir = true

+ 76 - 4
store/store_test.go

@@ -2,7 +2,6 @@ package store
 
 
 import (
 import (
 	"encoding/json"
 	"encoding/json"
-	"fmt"
 	"testing"
 	"testing"
 	"time"
 	"time"
 )
 )
@@ -70,9 +69,6 @@ func TestSaveAndRecovery(t *testing.T) {
 }
 }
 
 
 func TestExpire(t *testing.T) {
 func TestExpire(t *testing.T) {
-	fmt.Println(time.Now())
-	fmt.Println("TEST EXPIRE")
-
 	// test expire
 	// test expire
 	s := CreateStore(100)
 	s := CreateStore(100)
 	s.Set("foo", "bar", time.Now().Add(time.Second*1), 0)
 	s.Set("foo", "bar", time.Now().Add(time.Second*1), 0)
@@ -134,3 +130,79 @@ func TestExpire(t *testing.T) {
 	}
 	}
 
 
 }
 }
+
+func BenchmarkSet(b *testing.B) {
+	s := CreateStore(100)
+
+	keys := GenKeys(10000, 5)
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+
+		for i, key := range keys {
+			s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
+		}
+
+		s = CreateStore(100)
+	}
+}
+
+func BenchmarkGet(b *testing.B) {
+	s := CreateStore(100)
+
+	keys := GenKeys(100, 5)
+
+	for i, key := range keys {
+		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+
+		for _, key := range keys {
+			s.Get(key)
+		}
+
+	}
+}
+
+func BenchmarkSetAndGet(b *testing.B) {
+
+}
+
+func BenchmarkSnapshotSave(b *testing.B) {
+	s := CreateStore(100)
+
+	keys := GenKeys(10000, 5)
+
+	for i, key := range keys {
+		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
+	}
+
+	var state []byte
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		state, _ = s.Save()
+	}
+	b.SetBytes(int64(len(state)))
+}
+
+func BenchmarkSnapshotRecovery(b *testing.B) {
+	s := CreateStore(100)
+
+	keys := GenKeys(10000, 5)
+
+	for i, key := range keys {
+		s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i))
+	}
+
+	state, _ := s.Save()
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		newStore := CreateStore(100)
+		newStore.Recovery(state)
+	}
+	b.SetBytes(int64(len(state)))
+}

+ 1 - 1
store/tree.go

@@ -167,7 +167,7 @@ func (t *tree) list(directory string) ([]Node, []string, []bool, bool) {
 		if !treeNode.Dir {
 		if !treeNode.Dir {
 			nodes := make([]Node, 1)
 			nodes := make([]Node, 1)
 			nodes[0] = treeNode.InternalNode
 			nodes[0] = treeNode.InternalNode
-			return nodes, make([]string, 1), make([]bool, 1), true
+			return nodes, nil, nil, true
 		}
 		}
 		length := len(treeNode.NodeMap)
 		length := len(treeNode.NodeMap)
 		nodes := make([]Node, length)
 		nodes := make([]Node, length)

+ 76 - 9
store/tree_store_test.go

@@ -76,20 +76,15 @@ func TestStoreGet(t *testing.T) {
 		}
 		}
 	}
 	}
 
 
-	// speed test
+	keys = GenKeys(100, 10)
+
 	for i := 0; i < 100; i++ {
 	for i := 0; i < 100; i++ {
-		key := "/"
-		depth := rand.Intn(10)
-		for j := 0; j < depth; j++ {
-			key += "/" + strconv.Itoa(rand.Int()%10)
-		}
 		value := strconv.Itoa(rand.Int())
 		value := strconv.Itoa(rand.Int())
-		ts.set(key, CreateTestNode(value))
-		treeNode, ok := ts.get(key)
+		ts.set(keys[i], CreateTestNode(value))
+		treeNode, ok := ts.get(keys[i])
 
 
 		if !ok {
 		if !ok {
 			continue
 			continue
-			//t.Fatalf("Expect to get node, but not")
 		}
 		}
 		if treeNode.Value != value {
 		if treeNode.Value != value {
 			t.Fatalf("Expect value %s, but got %s", value, treeNode.Value)
 			t.Fatalf("Expect value %s, but got %s", value, treeNode.Value)
@@ -99,6 +94,78 @@ func TestStoreGet(t *testing.T) {
 	ts.traverse(f, true)
 	ts.traverse(f, true)
 }
 }
 
 
+func BenchmarkTreeStoreSet(b *testing.B) {
+
+	keys := GenKeys(10000, 10)
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+
+		ts := &tree{
+			&treeNode{
+				CreateTestNode("/"),
+				true,
+				make(map[string]*treeNode),
+			},
+		}
+
+		for _, key := range keys {
+			value := strconv.Itoa(rand.Int())
+			ts.set(key, CreateTestNode(value))
+		}
+	}
+}
+
+func BenchmarkTreeStoreGet(b *testing.B) {
+
+	keys := GenKeys(10000, 10)
+
+	ts := &tree{
+		&treeNode{
+			CreateTestNode("/"),
+			true,
+			make(map[string]*treeNode),
+		},
+	}
+
+	for _, key := range keys {
+		value := strconv.Itoa(rand.Int())
+		ts.set(key, CreateTestNode(value))
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		for _, key := range keys {
+			ts.get(key)
+		}
+	}
+}
+
+func BenchmarkTreeStoreList(b *testing.B) {
+
+	keys := GenKeys(10000, 10)
+
+	ts := &tree{
+		&treeNode{
+			CreateTestNode("/"),
+			true,
+			make(map[string]*treeNode),
+		},
+	}
+
+	for _, key := range keys {
+		value := strconv.Itoa(rand.Int())
+		ts.set(key, CreateTestNode(value))
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		for _, key := range keys {
+			ts.list(key)
+		}
+	}
+}
+
 func f(key string, n *Node) {
 func f(key string, n *Node) {
 	fmt.Println(key, "=", n.Value)
 	fmt.Println(key, "=", n.Value)
 }
 }

+ 2 - 13
store/watcher_test.go

@@ -1,8 +1,6 @@
 package store
 package store
 
 
 import (
 import (
-	"math/rand"
-	"strconv"
 	"testing"
 	"testing"
 	"time"
 	"time"
 )
 )
@@ -62,16 +60,7 @@ func TestWatch(t *testing.T) {
 func BenchmarkWatch(b *testing.B) {
 func BenchmarkWatch(b *testing.B) {
 	s := CreateStore(100)
 	s := CreateStore(100)
 
 
-	key := make([]string, 10000)
-	for i := 0; i < 10000; i++ {
-
-		key[i] = "/foo/"
-		depth := rand.Intn(10)
-
-		for j := 0; j < depth; j++ {
-			key[i] += "/" + strconv.Itoa(rand.Int()%10)
-		}
-	}
+	keys := GenKeys(10000, 10)
 
 
 	b.ResetTimer()
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 	for i := 0; i < b.N; i++ {
@@ -80,7 +69,7 @@ func BenchmarkWatch(b *testing.B) {
 			// create a new watcher
 			// create a new watcher
 			watchers[i] = NewWatcher()
 			watchers[i] = NewWatcher()
 			// add to the watchers list
 			// add to the watchers list
-			s.AddWatcher(key[i], watchers[i], 0)
+			s.AddWatcher(keys[i], watchers[i], 0)
 		}
 		}
 
 
 		s.watcher.stopWatchers()
 		s.watcher.stopWatchers()