func BenchmarkDBBatchManual10x100(b *testing.B) { db := MustOpenDB() defer db.MustClose() if err := db.Update(func(tx *bolt.Tx) error { _, err := tx.CreateBucket([]byte("bench")) return err }); err != nil { b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { start := make(chan struct{}) var wg sync.WaitGroup for major := 0; major < 10; major++ { wg.Add(1) go func(id uint32) { defer wg.Done() <-start insert100 := func(tx *bolt.Tx) error { h := fnv.New32a() buf := make([]byte, 4) for minor := uint32(0); minor < 100; minor++ { binary.LittleEndian.PutUint32(buf, uint32(id*100+minor)) h.Reset() _, _ = h.Write(buf[:]) k := h.Sum(nil) b := tx.Bucket([]byte("bench")) if err := b.Put(k, []byte("filler")); err != nil { return err } } return nil } if err := db.Update(insert100); err != nil { b.Fatal(err) } }(uint32(major)) } close(start) wg.Wait() } b.StopTimer() validateBatchBench(b, db) }
// BenchmarkTxnWrites benchmarks a number of transactions writing to the // same key back to back, without using Prepare/Flush. func BenchmarkTxnWrites(b *testing.B) { s := createTestDB(b) defer s.Stop() key := proto.Key("key") b.ResetTimer() for i := 0; i < b.N; i++ { s.Manual.Increment(1) if tErr := s.DB.Txn(func(txn *client.Txn) error { b := &client.Batch{} b.Put(key, fmt.Sprintf("value-%d", i)) return txn.CommitInBatch(b) }); tErr != nil { b.Fatal(tErr) } } }
// benchmarkSingleRoundtripWithLatency runs a number of transactions writing to // the same key back to back in a single round-trip. Latency is simulated // by pausing before each RPC sent. func benchmarkSingleRoundtripWithLatency(b *testing.B, latency time.Duration) { s := &LocalTestCluster{} s.Latency = latency s.Start(b) defer s.Stop() defer b.StopTimer() key := roachpb.Key("key") b.ResetTimer() for i := 0; i < b.N; i++ { if tErr := s.DB.Txn(func(txn *client.Txn) *roachpb.Error { b := txn.NewBatch() b.Put(key, fmt.Sprintf("value-%d", i)) return txn.CommitInBatch(b) }); tErr != nil { b.Fatal(tErr) } } }
// benchmarkSingleRoundtripWithLatency runs a number of transactions writing to // the same key back to back in a single round-trip. Latency is simulated // by pausing before each RPC sent. func benchmarkSingleRoundtripWithLatency(b *testing.B, latency time.Duration) { s := &localtestcluster.LocalTestCluster{} s.Latency = latency s.Start(b, testutils.NewNodeTestBaseContext(), InitSenderForLocalTestCluster) defer s.Stop() defer b.StopTimer() key := roachpb.Key("key") b.ResetTimer() for i := 0; i < b.N; i++ { if tErr := s.DB.Txn(context.TODO(), func(txn *client.Txn) error { b := txn.NewBatch() b.Put(key, fmt.Sprintf("value-%d", i)) return txn.CommitInBatch(b) }); tErr != nil { b.Fatal(tErr) } } }
func BenchmarkDBBatchAutomatic(b *testing.B) { db := MustOpenDB() defer db.MustClose() if err := db.Update(func(tx *bolt.Tx) error { _, err := tx.CreateBucket([]byte("bench")) return err }); err != nil { b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { start := make(chan struct{}) var wg sync.WaitGroup for round := 0; round < 1000; round++ { wg.Add(1) go func(id uint32) { defer wg.Done() <-start h := fnv.New32a() buf := make([]byte, 4) binary.LittleEndian.PutUint32(buf, id) _, _ = h.Write(buf[:]) k := h.Sum(nil) insert := func(tx *bolt.Tx) error { b := tx.Bucket([]byte("bench")) return b.Put(k, []byte("filler")) } if err := db.Batch(insert); err != nil { b.Error(err) return } }(uint32(round)) } close(start) wg.Wait() } b.StopTimer() validateBatchBench(b, db) }