From 71e91e24b064c1c8e33d92b7f324b6cd57d07f87 Mon Sep 17 00:00:00 2001 From: Steven Normore Date: Mon, 14 Apr 2014 16:25:04 +0000 Subject: move bench package to bench/cmd/bolt/bench --- bench/bench.go | 126 --------------------------- bench/config.go | 7 -- bench/generate.go | 24 ------ cmd/bolt/bench/bench.go | 126 +++++++++++++++++++++++++++ cmd/bolt/bench/config.go | 7 ++ cmd/bolt/bench/generate.go | 24 ++++++ tx_test.go | 208 ++++++++++++++++++++++----------------------- 7 files changed, 261 insertions(+), 261 deletions(-) delete mode 100644 bench/bench.go delete mode 100644 bench/config.go delete mode 100644 bench/generate.go create mode 100644 cmd/bolt/bench/bench.go create mode 100644 cmd/bolt/bench/config.go create mode 100644 cmd/bolt/bench/generate.go diff --git a/bench/bench.go b/bench/bench.go deleted file mode 100644 index df584f2..0000000 --- a/bench/bench.go +++ /dev/null @@ -1,126 +0,0 @@ -package bench - -import ( - "errors" - "fmt" - "sync" - "testing" - - "github.com/boltdb/bolt" -) - -const ( - BenchReadMode = "read" - BenchWriteMode = "write" - BenchSequentialTraversal = "sequential" - BenchRandomTraversal = "random" -) - -type Benchmark struct { - db *bolt.DB - config *Config -} - -func New(db *bolt.DB, config *Config) *Benchmark { - b := new(Benchmark) - b.db = db - b.config = config - return b -} - -func (bm *Benchmark) Run(b *testing.B) { - - // Read buckets and keys before benchmark begins so we don't knew the - // results. - buckets, err := buckets(bm.db) - if err != nil { - b.Fatalf("error: %+v", err) - } - bucketsWithKeys := make(map[string][]string) - for _, bucket := range buckets { - keys, err := keys(bm.db, bucket) - if err != nil { - b.Fatalf("error: %+v", err) - } - bucketsWithKeys[bucket] = keys - } - - b.ResetTimer() - - // Keep running a fixed number of parallel reads until we run out of time. - for i := 0; i < b.N; i++ { - var wg sync.WaitGroup - for j := 0; j < bm.config.Parallelism; j++ { - wg.Add(1) - go func() { - defer wg.Done() - if err := bm.readBuckets(b, bm.db, bucketsWithKeys); err != nil { - b.Fatalf("error: %+v", err) - } - }() - } - wg.Wait() - } -} - -// Run benchmark(s) for each of the given buckets. -func (bm *Benchmark) readBuckets(b *testing.B, db *bolt.DB, bucketsWithKeys map[string][]string) error { - return db.View(func(tx *bolt.Tx) error { - bucketsCount := len(bucketsWithKeys) - count := 0 - for bucket, keys := range bucketsWithKeys { - bucket := tx.Bucket([]byte(bucket)) - if err := bm.readKeys(b, bucket, keys); err != nil { - return err - } - count++ - } - if count != bucketsCount { - return errors.New(fmt.Sprintf("wrong count: %d; expected: %d", count, bucketsCount)) - } - return nil - }) -} - -func (bm *Benchmark) readKeys(b *testing.B, bucket *bolt.Bucket, keys []string) error { - c := bucket.Cursor() - keysCount := len(keys) - count := 0 - for k, _ := c.First(); k != nil; k, _ = c.Next() { - count++ - } - if count != keysCount { - return errors.New(fmt.Sprintf("wrong count: %d; expected: %d", count, keysCount)) - } - return nil -} - -func buckets(db *bolt.DB) ([]string, error) { - buckets := []string{} - err := db.View(func(tx *bolt.Tx) error { - // Iterate over each bucket. - return tx.ForEach(func(name []byte, _ *bolt.Bucket) error { - buckets = append(buckets, string(name)) - return nil - }) - }) - return buckets, err -} - -func keys(db *bolt.DB, bucket string) ([]string, error) { - keys := []string{} - err := db.View(func(tx *bolt.Tx) error { - // Find bucket. - b := tx.Bucket([]byte(bucket)) - if b == nil { - return errors.New(fmt.Sprintf("bucket %+v not found", b)) - } - - // Iterate over each key. - return b.ForEach(func(key, _ []byte) error { - keys = append(keys, string(key)) - return nil - }) - }) - return keys, err -} diff --git a/bench/config.go b/bench/config.go deleted file mode 100644 index dea08fd..0000000 --- a/bench/config.go +++ /dev/null @@ -1,7 +0,0 @@ -package bench - -type Config struct { - ReadWriteMode string - TraversalPattern string - Parallelism int -} diff --git a/bench/generate.go b/bench/generate.go deleted file mode 100644 index 8c5554d..0000000 --- a/bench/generate.go +++ /dev/null @@ -1,24 +0,0 @@ -package bench - -import ( - "fmt" - "strings" - - "github.com/boltdb/bolt" -) - -// Generate and write data to specified number of buckets/items. -func GenerateDB(db *bolt.DB, numBuckets, numItemsPerBucket int) error { - return db.Update(func(tx *bolt.Tx) error { - for bucketIndex := 0; bucketIndex < numBuckets; bucketIndex++ { - bucketName := fmt.Sprintf("bucket%08d") - tx.CreateBucket([]byte(bucketName)) - bucket := tx.Bucket([]byte(bucketName)) - for i := 0; i < numItemsPerBucket; i++ { - value := []byte(strings.Repeat("0", 100)) - bucket.Put([]byte(fmt.Sprintf("key%08d", i)), value) - } - } - return nil - }) -} diff --git a/cmd/bolt/bench/bench.go b/cmd/bolt/bench/bench.go new file mode 100644 index 0000000..df584f2 --- /dev/null +++ b/cmd/bolt/bench/bench.go @@ -0,0 +1,126 @@ +package bench + +import ( + "errors" + "fmt" + "sync" + "testing" + + "github.com/boltdb/bolt" +) + +const ( + BenchReadMode = "read" + BenchWriteMode = "write" + BenchSequentialTraversal = "sequential" + BenchRandomTraversal = "random" +) + +type Benchmark struct { + db *bolt.DB + config *Config +} + +func New(db *bolt.DB, config *Config) *Benchmark { + b := new(Benchmark) + b.db = db + b.config = config + return b +} + +func (bm *Benchmark) Run(b *testing.B) { + + // Read buckets and keys before benchmark begins so we don't knew the + // results. + buckets, err := buckets(bm.db) + if err != nil { + b.Fatalf("error: %+v", err) + } + bucketsWithKeys := make(map[string][]string) + for _, bucket := range buckets { + keys, err := keys(bm.db, bucket) + if err != nil { + b.Fatalf("error: %+v", err) + } + bucketsWithKeys[bucket] = keys + } + + b.ResetTimer() + + // Keep running a fixed number of parallel reads until we run out of time. + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + for j := 0; j < bm.config.Parallelism; j++ { + wg.Add(1) + go func() { + defer wg.Done() + if err := bm.readBuckets(b, bm.db, bucketsWithKeys); err != nil { + b.Fatalf("error: %+v", err) + } + }() + } + wg.Wait() + } +} + +// Run benchmark(s) for each of the given buckets. +func (bm *Benchmark) readBuckets(b *testing.B, db *bolt.DB, bucketsWithKeys map[string][]string) error { + return db.View(func(tx *bolt.Tx) error { + bucketsCount := len(bucketsWithKeys) + count := 0 + for bucket, keys := range bucketsWithKeys { + bucket := tx.Bucket([]byte(bucket)) + if err := bm.readKeys(b, bucket, keys); err != nil { + return err + } + count++ + } + if count != bucketsCount { + return errors.New(fmt.Sprintf("wrong count: %d; expected: %d", count, bucketsCount)) + } + return nil + }) +} + +func (bm *Benchmark) readKeys(b *testing.B, bucket *bolt.Bucket, keys []string) error { + c := bucket.Cursor() + keysCount := len(keys) + count := 0 + for k, _ := c.First(); k != nil; k, _ = c.Next() { + count++ + } + if count != keysCount { + return errors.New(fmt.Sprintf("wrong count: %d; expected: %d", count, keysCount)) + } + return nil +} + +func buckets(db *bolt.DB) ([]string, error) { + buckets := []string{} + err := db.View(func(tx *bolt.Tx) error { + // Iterate over each bucket. + return tx.ForEach(func(name []byte, _ *bolt.Bucket) error { + buckets = append(buckets, string(name)) + return nil + }) + }) + return buckets, err +} + +func keys(db *bolt.DB, bucket string) ([]string, error) { + keys := []string{} + err := db.View(func(tx *bolt.Tx) error { + // Find bucket. + b := tx.Bucket([]byte(bucket)) + if b == nil { + return errors.New(fmt.Sprintf("bucket %+v not found", b)) + } + + // Iterate over each key. + return b.ForEach(func(key, _ []byte) error { + keys = append(keys, string(key)) + return nil + }) + }) + return keys, err +} diff --git a/cmd/bolt/bench/config.go b/cmd/bolt/bench/config.go new file mode 100644 index 0000000..dea08fd --- /dev/null +++ b/cmd/bolt/bench/config.go @@ -0,0 +1,7 @@ +package bench + +type Config struct { + ReadWriteMode string + TraversalPattern string + Parallelism int +} diff --git a/cmd/bolt/bench/generate.go b/cmd/bolt/bench/generate.go new file mode 100644 index 0000000..8c5554d --- /dev/null +++ b/cmd/bolt/bench/generate.go @@ -0,0 +1,24 @@ +package bench + +import ( + "fmt" + "strings" + + "github.com/boltdb/bolt" +) + +// Generate and write data to specified number of buckets/items. +func GenerateDB(db *bolt.DB, numBuckets, numItemsPerBucket int) error { + return db.Update(func(tx *bolt.Tx) error { + for bucketIndex := 0; bucketIndex < numBuckets; bucketIndex++ { + bucketName := fmt.Sprintf("bucket%08d") + tx.CreateBucket([]byte(bucketName)) + bucket := tx.Bucket([]byte(bucketName)) + for i := 0; i < numItemsPerBucket; i++ { + value := []byte(strings.Repeat("0", 100)) + bucket.Put([]byte(fmt.Sprintf("key%08d", i)), value) + } + } + return nil + }) +} diff --git a/tx_test.go b/tx_test.go index 61810d3..178d5aa 100644 --- a/tx_test.go +++ b/tx_test.go @@ -267,110 +267,110 @@ func TestTx_OnCommit_Rollback(t *testing.T) { assert.Equal(t, 0, x) } -func BenchmarkReadSequential_1Concurrency_1Buckets_1Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1, 1) -} -func BenchmarkReadSequential_1Concurrency_1Buckets_10Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10, 1) -} -func BenchmarkReadSequential_1Concurrency_1Buckets_100Items(b *testing.B) { - benchmarkReadSequential(b, 1, 100, 1) -} -func BenchmarkReadSequential_1Concurrency_1Buckets_1000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1000, 1) -} -func BenchmarkReadSequential_1Concurrency_1Buckets_10000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10000, 1) -} - -func BenchmarkReadSequential_10Concurrency_1Buckets_1Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1, 10) -} -func BenchmarkReadSequential_10Concurrency_1Buckets_10Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10, 10) -} -func BenchmarkReadSequential_10Concurrency_1Buckets_100Items(b *testing.B) { - benchmarkReadSequential(b, 1, 100, 10) -} -func BenchmarkReadSequential_10Concurrency_1Buckets_1000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1000, 10) -} -func BenchmarkReadSequential_10Concurrency_1Buckets_10000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10000, 10) -} - -func BenchmarkReadSequential_100Concurrency_1Buckets_1Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1, 100) -} -func BenchmarkReadSequential_100Concurrency_1Buckets_10Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10, 100) -} -func BenchmarkReadSequential_100Concurrency_1Buckets_100Items(b *testing.B) { - benchmarkReadSequential(b, 1, 100, 100) -} -func BenchmarkReadSequential_100Concurrency_1Buckets_1000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1000, 100) -} -func BenchmarkReadSequential_100Concurrency_1Buckets_10000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10000, 100) -} - -func BenchmarkReadSequential_1000Concurrency_1Buckets_1Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1, 1000) -} -func BenchmarkReadSequential_1000Concurrency_1Buckets_10Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10, 1000) -} -func BenchmarkReadSequential_1000Concurrency_1Buckets_100Items(b *testing.B) { - benchmarkReadSequential(b, 1, 100, 1000) -} -func BenchmarkReadSequential_1000Concurrency_1Buckets_1000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1000, 1000) -} -func BenchmarkReadSequential_1000Concurrency_1Buckets_10000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10000, 1000) -} - -func BenchmarkReadSequential_10000Concurrency_1Buckets_1Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1, 10000) -} -func BenchmarkReadSequential_10000Concurrency_1Buckets_10Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10, 10000) -} -func BenchmarkReadSequential_10000Concurrency_1Buckets_100Items(b *testing.B) { - benchmarkReadSequential(b, 1, 100, 10000) -} -func BenchmarkReadSequential_10000Concurrency_1Buckets_1000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 1000, 10000) -} -func BenchmarkReadSequential_10000Concurrency_1Buckets_10000Items(b *testing.B) { - benchmarkReadSequential(b, 1, 10000, 10000) -} - -func benchmark(b *testing.B, readWriteMode, traversalPattern string, numBuckets, numItemsPerBucket, parallelism int) { - withOpenDB(func(db *DB, path string) { - if err := bench.GenerateDB(db, numBuckets, numItemsPerBucket); err != nil { - b.Fatal(err) - } - bench.New(db, &bench.Config{ - ReadWriteMode: readWriteMode, - TraversalPattern: traversalPattern, - Parallelism: parallelism, - }).Run(b) - }) -} - -func benchmarkRead(b *testing.B, traversalPattern string, numBuckets, numItemsPerBucket, parallelism int) { - benchmark(b, bench.BenchReadMode, traversalPattern, numBuckets, numItemsPerBucket, parallelism) -} - -func benchmarkReadSequential(b *testing.B, numBuckets, numItemsPerBucket, parallelism int) { - benchmark(b, bench.BenchReadMode, bench.BenchSequentialTraversal, numBuckets, numItemsPerBucket, parallelism) -} - -func benchmarkReadRandom(b *testing.B, numBuckets, numItemsPerBucket, parallelism int) { - benchmark(b, bench.BenchReadMode, bench.BenchRandomTraversal, numBuckets, numItemsPerBucket, parallelism) -} +// func BenchmarkReadSequential_1Concurrency_1Buckets_1Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1, 1) +// } +// func BenchmarkReadSequential_1Concurrency_1Buckets_10Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10, 1) +// } +// func BenchmarkReadSequential_1Concurrency_1Buckets_100Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 100, 1) +// } +// func BenchmarkReadSequential_1Concurrency_1Buckets_1000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1000, 1) +// } +// func BenchmarkReadSequential_1Concurrency_1Buckets_10000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10000, 1) +// } + +// func BenchmarkReadSequential_10Concurrency_1Buckets_1Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1, 10) +// } +// func BenchmarkReadSequential_10Concurrency_1Buckets_10Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10, 10) +// } +// func BenchmarkReadSequential_10Concurrency_1Buckets_100Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 100, 10) +// } +// func BenchmarkReadSequential_10Concurrency_1Buckets_1000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1000, 10) +// } +// func BenchmarkReadSequential_10Concurrency_1Buckets_10000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10000, 10) +// } + +// func BenchmarkReadSequential_100Concurrency_1Buckets_1Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1, 100) +// } +// func BenchmarkReadSequential_100Concurrency_1Buckets_10Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10, 100) +// } +// func BenchmarkReadSequential_100Concurrency_1Buckets_100Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 100, 100) +// } +// func BenchmarkReadSequential_100Concurrency_1Buckets_1000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1000, 100) +// } +// func BenchmarkReadSequential_100Concurrency_1Buckets_10000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10000, 100) +// } + +// func BenchmarkReadSequential_1000Concurrency_1Buckets_1Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1, 1000) +// } +// func BenchmarkReadSequential_1000Concurrency_1Buckets_10Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10, 1000) +// } +// func BenchmarkReadSequential_1000Concurrency_1Buckets_100Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 100, 1000) +// } +// func BenchmarkReadSequential_1000Concurrency_1Buckets_1000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1000, 1000) +// } +// func BenchmarkReadSequential_1000Concurrency_1Buckets_10000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10000, 1000) +// } + +// func BenchmarkReadSequential_10000Concurrency_1Buckets_1Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1, 10000) +// } +// func BenchmarkReadSequential_10000Concurrency_1Buckets_10Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10, 10000) +// } +// func BenchmarkReadSequential_10000Concurrency_1Buckets_100Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 100, 10000) +// } +// func BenchmarkReadSequential_10000Concurrency_1Buckets_1000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 1000, 10000) +// } +// func BenchmarkReadSequential_10000Concurrency_1Buckets_10000Items(b *testing.B) { +// benchmarkReadSequential(b, 1, 10000, 10000) +// } + +// func benchmark(b *testing.B, readWriteMode, traversalPattern string, numBuckets, numItemsPerBucket, parallelism int) { +// withOpenDB(func(db *DB, path string) { +// if err := bench.GenerateDB(db, numBuckets, numItemsPerBucket); err != nil { +// b.Fatal(err) +// } +// bench.New(db, &bench.Config{ +// ReadWriteMode: readWriteMode, +// TraversalPattern: traversalPattern, +// Parallelism: parallelism, +// }).Run(b) +// }) +// } + +// func benchmarkRead(b *testing.B, traversalPattern string, numBuckets, numItemsPerBucket, parallelism int) { +// benchmark(b, bench.BenchReadMode, traversalPattern, numBuckets, numItemsPerBucket, parallelism) +// } + +// func benchmarkReadSequential(b *testing.B, numBuckets, numItemsPerBucket, parallelism int) { +// benchmark(b, bench.BenchReadMode, bench.BenchSequentialTraversal, numBuckets, numItemsPerBucket, parallelism) +// } + +// func benchmarkReadRandom(b *testing.B, numBuckets, numItemsPerBucket, parallelism int) { +// benchmark(b, bench.BenchReadMode, bench.BenchRandomTraversal, numBuckets, numItemsPerBucket, parallelism) +// } // Benchmark the performance iterating over a cursor. func BenchmarkTxCursor1(b *testing.B) { benchmarkTxCursor(b, 1) } -- cgit v1.2.3