mirror of
				https://github.com/taigrr/bitcask
				synced 2025-01-18 04:03:17 -08:00 
			
		
		
		
	Improved benchmark test suite for various key/value sizes
This commit is contained in:
		
							parent
							
								
									3b9627aeb8
								
							
						
					
					
						commit
						71a42800fe
					
				
							
								
								
									
										24
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								README.md
									
									
									
									
									
								
							@ -97,13 +97,33 @@ Benchmarks run on a 11" Macbook with a 1.4Ghz Intel Core i7:
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
$ make bench
 | 
					$ make bench
 | 
				
			||||||
...
 | 
					...
 | 
				
			||||||
BenchmarkGet-4   	  300000	      5065 ns/op	     144 B/op	       4 allocs/op
 | 
					BenchmarkGet/128B-4         	  200000	      5780 ns/op	     400 B/op	       5 allocs/op
 | 
				
			||||||
BenchmarkPut-4   	  100000	     14640 ns/op	     699 B/op	       7 allocs/op
 | 
					BenchmarkGet/256B-4         	  200000	      6138 ns/op	     656 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/512B-4         	  200000	      5967 ns/op	    1200 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/1K-4           	  200000	      6290 ns/op	    2288 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/2K-4           	  200000	      6293 ns/op	    4464 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/4K-4           	  200000	      7673 ns/op	    9072 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/8K-4           	  200000	     10373 ns/op	   17776 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/16K-4          	  100000	     14227 ns/op	   34928 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkGet/32K-4          	  100000	     25953 ns/op	   73840 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/128B-4         	  100000	     17353 ns/op	     680 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/256B-4         	  100000	     18620 ns/op	     808 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/512B-4         	  100000	     19068 ns/op	    1096 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/1K-4           	  100000	     23738 ns/op	    1673 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/2K-4           	   50000	     25118 ns/op	    2826 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/4K-4           	   50000	     44605 ns/op	    5389 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/8K-4           	   30000	     55237 ns/op	   10001 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/16K-4          	   20000	     78966 ns/op	   18972 B/op	       5 allocs/op
 | 
				
			||||||
 | 
					BenchmarkPut/32K-4          	   10000	    116253 ns/op	   41520 B/op	       5 allocs/op
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For 128B values:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* ~180,000 reads/sec
 | 
					* ~180,000 reads/sec
 | 
				
			||||||
*  ~60,000 writes/sec
 | 
					*  ~60,000 writes/sec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The full benchmark above shows linear performance as you increase key/value sizes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bitcask is licensed under the [MIT License](https://github.com/prologic/bitcask/blob/master/LICENSE)
 | 
					bitcask is licensed under the [MIT License](https://github.com/prologic/bitcask/blob/master/LICENSE)
 | 
				
			||||||
 | 
				
			|||||||
@ -294,6 +294,11 @@ func TestLocking(t *testing.T) {
 | 
				
			|||||||
	assert.Equal("error: cannot acquire lock", err.Error())
 | 
						assert.Equal("error: cannot acquire lock", err.Error())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type benchmarkTestCase struct {
 | 
				
			||||||
 | 
						name string
 | 
				
			||||||
 | 
						size int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func BenchmarkGet(b *testing.B) {
 | 
					func BenchmarkGet(b *testing.B) {
 | 
				
			||||||
	testdir, err := ioutil.TempDir("", "bitcask")
 | 
						testdir, err := ioutil.TempDir("", "bitcask")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@ -306,21 +311,40 @@ func BenchmarkGet(b *testing.B) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer db.Close()
 | 
						defer db.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = db.Put("foo", []byte("bar"))
 | 
						tests := []benchmarkTestCase{
 | 
				
			||||||
 | 
							{"128B", 128},
 | 
				
			||||||
 | 
							{"256B", 256},
 | 
				
			||||||
 | 
							{"512B", 512},
 | 
				
			||||||
 | 
							{"1K", 1024},
 | 
				
			||||||
 | 
							{"2K", 2048},
 | 
				
			||||||
 | 
							{"4K", 4096},
 | 
				
			||||||
 | 
							{"8K", 8192},
 | 
				
			||||||
 | 
							{"16K", 16384},
 | 
				
			||||||
 | 
							{"32K", 32768},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							b.Run(tt.name, func(b *testing.B) {
 | 
				
			||||||
 | 
								key := "foo"
 | 
				
			||||||
 | 
								value := []byte(strings.Repeat(" ", tt.size))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								err = db.Put(key, value)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				b.Fatal(err)
 | 
									b.Fatal(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			b.ResetTimer()
 | 
								b.ResetTimer()
 | 
				
			||||||
			for i := 0; i < b.N; i++ {
 | 
								for i := 0; i < b.N; i++ {
 | 
				
			||||||
		val, err := db.Get("foo")
 | 
									val, err := db.Get(key)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					b.Fatal(err)
 | 
										b.Fatal(err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
		if string(val) != "bar" {
 | 
									if string(val) != string(value) {
 | 
				
			||||||
			b.Errorf("expected val=bar got=%s", val)
 | 
										b.Errorf("unexpected value")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func BenchmarkPut(b *testing.B) {
 | 
					func BenchmarkPut(b *testing.B) {
 | 
				
			||||||
@ -335,11 +359,29 @@ func BenchmarkPut(b *testing.B) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer db.Close()
 | 
						defer db.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tests := []benchmarkTestCase{
 | 
				
			||||||
 | 
							{"128B", 128},
 | 
				
			||||||
 | 
							{"256B", 256},
 | 
				
			||||||
 | 
							{"512B", 512},
 | 
				
			||||||
 | 
							{"1K", 1024},
 | 
				
			||||||
 | 
							{"2K", 2048},
 | 
				
			||||||
 | 
							{"4K", 4096},
 | 
				
			||||||
 | 
							{"8K", 8192},
 | 
				
			||||||
 | 
							{"16K", 16384},
 | 
				
			||||||
 | 
							{"32K", 32768},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							b.Run(tt.name, func(b *testing.B) {
 | 
				
			||||||
 | 
								key := "foo"
 | 
				
			||||||
 | 
								value := []byte(strings.Repeat(" ", tt.size))
 | 
				
			||||||
			b.ResetTimer()
 | 
								b.ResetTimer()
 | 
				
			||||||
			for i := 0; i < b.N; i++ {
 | 
								for i := 0; i < b.N; i++ {
 | 
				
			||||||
		err := db.Put(fmt.Sprintf("key%d", i), []byte("bar"))
 | 
									err := db.Put(key, value)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					b.Fatal(err)
 | 
										b.Fatal(err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user