197 lines
4.3 KiB
Go
197 lines
4.3 KiB
Go
|
package cmap
|
||
|
|
||
|
import "testing"
|
||
|
import "strconv"
|
||
|
|
||
|
func BenchmarkItems(b *testing.B) {
|
||
|
m := New()
|
||
|
|
||
|
// Insert 100 elements.
|
||
|
for i := 0; i < 10000; i++ {
|
||
|
m.Set(strconv.Itoa(i), Animal{strconv.Itoa(i)})
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.Items()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkMarshalJson(b *testing.B) {
|
||
|
m := New()
|
||
|
|
||
|
// Insert 100 elements.
|
||
|
for i := 0; i < 10000; i++ {
|
||
|
m.Set(strconv.Itoa(i), Animal{strconv.Itoa(i)})
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.MarshalJSON()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkStrconv(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
strconv.Itoa(i)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkSingleInsertAbsent(b *testing.B) {
|
||
|
m := New()
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.Set(strconv.Itoa(i), "value")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkSingleInsertPresent(b *testing.B) {
|
||
|
m := New()
|
||
|
m.Set("key", "value")
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.Set("key", "value")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func benchmarkMultiInsertDifferent(b *testing.B) {
|
||
|
m := New()
|
||
|
finished := make(chan struct{}, b.N)
|
||
|
_, set := GetSet(m, finished)
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
set(strconv.Itoa(i), "value")
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
<-finished
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkMultiInsertDifferent_1_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiInsertDifferent, b, 1)
|
||
|
}
|
||
|
func BenchmarkMultiInsertDifferent_16_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiInsertDifferent, b, 16)
|
||
|
}
|
||
|
func BenchmarkMultiInsertDifferent_32_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiInsertDifferent, b, 32)
|
||
|
}
|
||
|
func BenchmarkMultiInsertDifferent_256_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetDifferent, b, 256)
|
||
|
}
|
||
|
|
||
|
func BenchmarkMultiInsertSame(b *testing.B) {
|
||
|
m := New()
|
||
|
finished := make(chan struct{}, b.N)
|
||
|
_, set := GetSet(m, finished)
|
||
|
m.Set("key", "value")
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
set("key", "value")
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
<-finished
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkMultiGetSame(b *testing.B) {
|
||
|
m := New()
|
||
|
finished := make(chan struct{}, b.N)
|
||
|
get, _ := GetSet(m, finished)
|
||
|
m.Set("key", "value")
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
get("key", "value")
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
<-finished
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func benchmarkMultiGetSetDifferent(b *testing.B) {
|
||
|
m := New()
|
||
|
finished := make(chan struct{}, 2*b.N)
|
||
|
get, set := GetSet(m, finished)
|
||
|
m.Set("-1", "value")
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
set(strconv.Itoa(i-1), "value")
|
||
|
get(strconv.Itoa(i), "value")
|
||
|
}
|
||
|
for i := 0; i < 2*b.N; i++ {
|
||
|
<-finished
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkMultiGetSetDifferent_1_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetDifferent, b, 1)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetDifferent_16_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetDifferent, b, 16)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetDifferent_32_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetDifferent, b, 32)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetDifferent_256_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetDifferent, b, 256)
|
||
|
}
|
||
|
|
||
|
func benchmarkMultiGetSetBlock(b *testing.B) {
|
||
|
m := New()
|
||
|
finished := make(chan struct{}, 2*b.N)
|
||
|
get, set := GetSet(m, finished)
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.Set(strconv.Itoa(i%100), "value")
|
||
|
}
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
set(strconv.Itoa(i%100), "value")
|
||
|
get(strconv.Itoa(i%100), "value")
|
||
|
}
|
||
|
for i := 0; i < 2*b.N; i++ {
|
||
|
<-finished
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkMultiGetSetBlock_1_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetBlock, b, 1)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetBlock_16_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetBlock, b, 16)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetBlock_32_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetBlock, b, 32)
|
||
|
}
|
||
|
func BenchmarkMultiGetSetBlock_256_Shard(b *testing.B) {
|
||
|
runWithShards(benchmarkMultiGetSetBlock, b, 256)
|
||
|
}
|
||
|
|
||
|
func GetSet(m ConcurrentMap, finished chan struct{}) (set func(key, value string), get func(key, value string)) {
|
||
|
return func(key, value string) {
|
||
|
for i := 0; i < 10; i++ {
|
||
|
m.Get(key)
|
||
|
}
|
||
|
finished <- struct{}{}
|
||
|
}, func(key, value string) {
|
||
|
for i := 0; i < 10; i++ {
|
||
|
m.Set(key, value)
|
||
|
}
|
||
|
finished <- struct{}{}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func runWithShards(bench func(b *testing.B), b *testing.B, shardsCount int) {
|
||
|
oldShardsCount := SHARD_COUNT
|
||
|
SHARD_COUNT = shardsCount
|
||
|
bench(b)
|
||
|
SHARD_COUNT = oldShardsCount
|
||
|
}
|
||
|
|
||
|
func BenchmarkKeys(b *testing.B) {
|
||
|
m := New()
|
||
|
|
||
|
// Insert 100 elements.
|
||
|
for i := 0; i < 10000; i++ {
|
||
|
m.Set(strconv.Itoa(i), Animal{strconv.Itoa(i)})
|
||
|
}
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.Keys()
|
||
|
}
|
||
|
}
|