Created
April 4, 2020 04:23
-
-
Save Fullstop000/5d4222273afd963d209272d3fc8d8ac6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"sync" | |
"testing" | |
cmap "github.com/orcaman/concurrent-map" | |
) | |
func BenchmarkConcurrentWrite(b *testing.B) { | |
for _, c := range []int{10, 100, 1000, 10000, 100000} { | |
b.Run(fmt.Sprintf("sync.Map%d", c), func(b *testing.B) { | |
for i := 0; i < b.N; i++ { | |
sm := sync.Map{} | |
wg := sync.WaitGroup{} | |
for j := 0; j < c; j++ { | |
key := fmt.Sprintf("key%d", j) | |
wg.Add(1) | |
go func(k string) { | |
sm.Store(k, "value") | |
wg.Done() | |
}(key) | |
} | |
wg.Wait() | |
} | |
}) | |
b.Run(fmt.Sprintf("cmap%d", c), func(b *testing.B) { | |
for i := 0; i < b.N; i++ { | |
cm := cmap.New() | |
wg := sync.WaitGroup{} | |
for j := 0; j < c; j++ { | |
key := fmt.Sprintf("key%d", j) | |
wg.Add(1) | |
go func(k string) { | |
cm.Set(k, "value") | |
wg.Done() | |
}(key) | |
} | |
} | |
}) | |
} | |
} | |
func BenchmarkConcurrentRead(b *testing.B) { | |
for _, c := range []int{10, 100, 1000, 10000, 100000} { | |
b.Run(fmt.Sprintf("sync.Map%d", c), func(b *testing.B) { | |
sm := sync.Map{} | |
wg := sync.WaitGroup{} | |
for i := 0; i < c; i++ { | |
key := fmt.Sprintf("key%d", i) | |
value := fmt.Sprintf("value%d", i) | |
wg.Add(1) | |
go func() { | |
sm.Store(key, value) | |
wg.Done() | |
}() | |
} | |
wg.Wait() | |
for i := 0; i < b.N; i++ { | |
for j := 0; j < 2*c; j++ { | |
key := fmt.Sprintf("key%d", j%c) | |
wg.Add(1) | |
go func() { | |
_, ok := sm.Load(key) | |
if !ok { | |
panic(key) | |
} | |
wg.Done() | |
}() | |
} | |
wg.Wait() | |
} | |
}) | |
b.Run(fmt.Sprintf("cmap%d", c), func(b *testing.B) { | |
cm := cmap.New() | |
wg := sync.WaitGroup{} | |
for i := 0; i < c; i++ { | |
key := fmt.Sprintf("key%d", i) | |
value := fmt.Sprintf("value%d", i) | |
wg.Add(1) | |
go func() { | |
cm.Set(key, value) | |
wg.Done() | |
}() | |
} | |
wg.Wait() | |
for i := 0; i < b.N; i++ { | |
for j := 0; j < 2*c; j++ { | |
key := fmt.Sprintf("key%d", j%c) | |
wg.Add(1) | |
go func() { | |
_, ok := cm.Get(key) | |
if !ok { | |
panic(key) | |
} | |
wg.Done() | |
}() | |
} | |
wg.Wait() | |
} | |
}) | |
} | |
} |
Author
Fullstop000
commented
Apr 4, 2020
goos: linux
goarch: amd64
pkg: cmap
BenchmarkConcurrentRead/sync.Map10-32 158725 8387 ns/op 289 B/op 38 allocs/op
BenchmarkConcurrentRead/cmap10-32 152773 7773 ns/op 288 B/op 38 allocs/op
BenchmarkConcurrentRead/sync.Map100-32 12218 99383 ns/op 3193 B/op 398 allocs/op
BenchmarkConcurrentRead/cmap100-32 13064 92989 ns/op 3192 B/op 398 allocs/op
BenchmarkConcurrentRead/sync.Map1000-32 922 1310089 ns/op 32558 B/op 4009 allocs/op
BenchmarkConcurrentRead/cmap1000-32 914 1337196 ns/op 32634 B/op 4004 allocs/op
BenchmarkConcurrentRead/sync.Map10000-32 81 13844117 ns/op 351851 B/op 41158 allocs/op
BenchmarkConcurrentRead/cmap10000-32 85 13823916 ns/op 342371 B/op 40595 allocs/op
BenchmarkConcurrentRead/sync.Map100000-32 6 180707933 ns/op 7119746 B/op 558035 allocs/op
BenchmarkConcurrentRead/cmap100000-32 7 154268071 ns/op 5519739 B/op 471748 allocs/op
PASS
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment