目录
测试环境
测试代码
运行指令
测试结果
结论
goos: linux
goarch: amd64
go version go1.14 linux/amd64
Run on (8 X 2394.37 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x8)
L1 Instruction 32 KiB (x8)
L2 Unified 4096 KiB (x8)
L3 Unified 16384 KiB (x1)
文件:src/benchmark/syncmap_test.go
参数说明:
iteTimes:每个go协和进行map操作次数
writePer:写占用的比例
mod:取模余数。没什么用。取-1时可以控制全都是读。取0时,writePer=1时可以控制都是写。
正如代码所示:有1/writePer的操作为写。
可以看出随着读比例升高,sync.map性能越来越好。
package main
import (
"sync"
"testing"
)
var iteTimes = 10000
var writePer = 10000
var mod = 1
func BenchmarkSyncMapGo(b *testing.B) {
var mp sync.Map
var wg sync.WaitGroup
for i := 0; i < b.N; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
for j := 0; j < iteTimes; j++ {
if i%writePer == mod {
mp.Store(0, 0)
} else {
_, _ = mp.Load(0)
}
}
}(i)
}
wg.Wait()
}
func BenchmarkMapGo(b *testing.B) {
var mp = make(map[int]int)
var wg sync.WaitGroup
var lock sync.Mutex
for i := 0; i < b.N; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
for j := 0; j < iteTimes; j++ {
lock.Lock()
if i%writePer == mod {
mp[0] = 0
} else {
i = mp[0]
}
lock.Unlock()
}
}(i)
}
wg.Wait()
}
go test -v -bench=MapGo -count=1 -benchtime=2s benchmark
测试序号 | 说明 | writePer | mod | sync.Map ns/op | map ns/op | map/sync.Map |
---|---|---|---|---|---|---|
1 | 全写 | 1 | 0 | 4378931 | 2257652 | 0.515571495 |
2 | 1/2写 | 2 | 1 | 742785 | 1957077 | 2.634782609 |
3 | 1/10写 | 10 | 1 | 201720 | 1793032 | 8.888717034 |
4 | 1/20写 | 20 | 1 | 122396 | 1758052 | 14.36363933 |
5 | 1/40写 | 40 | 1 | 91850 | 1740995 | 18.9547632 |
6 | 1/50写 | 50 | 1 | 86850 | 1768100 | 20.35808866 |
7 | 1/100写 | 100 | 1 | 72843 | 1762022 | 24.18931126 |
8 | 1/500写 | 500 | 1 | 58097 | 1709021 | 29.41668244 |
9 | 1/1000写 | 1000 | 1 | 57137 | 1746151 | 30.56077498 |
10 | 1/5000写 | 5000 | 1 | 55446 | 1736288 | 31.31493706 |
11 | 只读的情况下 | xx | -1 | 37198 | 1648084 | 44.30571536 |
sync.Map的性能高体现在读操作远多于写操作的时候。 极端情况下,只有读操作时,是普通map的性能的44.3倍。
反过来,如果是全写,没有读,那么sync.Map还不如加普通map+mutex锁呢。只有普通map性能的一半。
建议使用sync.Map时一定要考虑读定比例。当写操作只占总操作的<=1/10的时候,使用sync.Map性能会明显高很多。
加上main函数,可以更细的测量。
package main
import (
"fmt"
"testing"
)
func BenchmarkParam(b *testing.B) {
}
func TestMain(m *testing.M) {
println("id Map SyncMap Map/SyncMap")
testing.Benchmark(BenchmarkParam)
for writePer = 1; writePer <= 1000; writePer++ {
a := testing.Benchmark(BenchmarkMapGo)
b := testing.Benchmark(BenchmarkSyncMapGo)
fmt.Printf("%v %v %v %.4f\n", writePer, a.NsPerOp(), b.NsPerOp(), float64(a.NsPerOp())/float64(b.NsPerOp()))
if writePer > 100 {
writePer += 9
}
}
}
曲线有振荡,不知道为什么。。。
id | Map | SyncMap | Map/SyncMap |
1 | 1589828 | 4212563 | 0.3774 |
2 | 1820723 | 1067517 | 1.7056 |
3 | 1734218 | 766465 | 2.2626 |
4 | 1984278 | 752076 | 2.6384 |
5 | 2014603 | 586788 | 3.4333 |
6 | 2008830 | 414456 | 4.8469 |
7 | 1692212 | 448648 | 3.7718 |
8 | 2084987 | 518837 | 4.0186 |
9 | 2111296 | 380821 | 5.5441 |
10 | 1590380 | 383135 | 4.151 |
11 | 1994645 | 371854 | 5.3641 |
12 | 1984163 | 343963 | 5.7685 |
13 | 2132823 | 325789 | 6.5466 |
14 | 1920703 | 306471 | 6.2672 |
15 | 1613749 | 319277 | 5.0544 |
16 | 1906071 | 323929 | 5.8842 |
17 | 1747082 | 291970 | 5.9838 |
18 | 1971953 | 244048 | 8.0802 |
19 | 1939415 | 274136 | 7.0746 |
20 | 2009997 | 326469 | 6.1568 |
21 | 2035316 | 236476 | 8.6069 |
22 | 2296287 | 219261 | 10.4728 |
23 | 2350051 | 205525 | 11.4344 |
24 | 2124174 | 217523 | 9.7653 |
25 | 2133741 | 193331 | 11.0367 |
26 | 2140850 | 142109 | 15.0648 |
27 | 2130037 | 138857 | 15.3398 |
28 | 2149650 | 103432 | 20.7832 |
29 | 2167585 | 105211 | 20.6023 |
30 | 2155809 | 112118 | 19.228 |
31 | 2156159 | 109483 | 19.694 |
32 | 2164633 | 106134 | 20.3953 |
33 | 2157534 | 112452 | 19.1863 |
34 | 2124208 | 120976 | 17.5589 |
35 | 2378486 | 194847 | 12.2069 |
36 | 2363503 | 191088 | 12.3687 |
37 | 2384755 | 98878 | 24.1182 |
38 | 2301976 | 183540 | 12.5421 |
39 | 2327617 | 169283 | 13.7499 |
40 | 2360339 | 151789 | 15.5501 |
41 | 2368189 | 174849 | 13.5442 |
42 | 2320106 | 149817 | 15.4863 |
43 | 2342688 | 115870 | 20.2182 |
44 | 2360380 | 109504 | 21.5552 |
45 | 2336090 | 166961 | 13.9918 |
46 | 2356007 | 167499 | 14.0658 |
47 | 2366240 | 88849 | 26.6322 |
48 | 2149384 | 86107 | 24.9618 |
49 | 2105380 | 89431 | 23.5419 |
50 | 2147692 | 88786 | 24.1895 |
51 | 2164954 | 146066 | 14.8218 |
52 | 2318934 | 151549 | 15.3015 |
53 | 2302276 | 142438 | 16.1634 |
54 | 2107696 | 83098 | 25.364 |
55 | 2161764 | 85015 | 25.428 |
56 | 2149420 | 81026 | 26.5275 |
57 | 2296040 | 142271 | 16.1385 |
58 | 2122765 | 81386 | 26.0827 |
59 | 2339419 | 126959 | 18.4266 |
60 | 2363633 | 139593 | 16.9323 |
61 | 2331447 | 136161 | 17.1227 |
62 | 2331869 | 137623 | 16.9439 |
63 | 2408515 | 132618 | 18.1613 |
64 | 2399392 | 98447 | 24.3724 |
65 | 2157037 | 80650 | 26.7457 |
66 | 2208759 | 131885 | 16.7476 |
67 | 2270660 | 133284 | 17.0363 |
68 | 2301833 | 105867 | 21.7427 |
69 | 2234028 | 128212 | 17.4245 |
70 | 2251311 | 125172 | 17.9857 |
71 | 2171180 | 125119 | 17.3529 |
72 | 2121459 | 77897 | 27.2342 |
73 | 2103298 | 79169 | 26.5672 |
74 | 2307954 | 74105 | 31.1444 |
75 | 2151011 | 105313 | 20.4249 |
76 | 2150043 | 77377 | 27.7866 |
77 | 2168714 | 74117 | 29.2607 |
78 | 2166159 | 76713 | 28.2372 |
79 | 2179968 | 77803 | 28.0191 |
80 | 2205332 | 76630 | 28.779 |
81 | 2219461 | 74963 | 29.6074 |
82 | 2160909 | 73397 | 29.4414 |
83 | 2161554 | 79175 | 27.301 |
84 | 2166263 | 76460 | 28.332 |
85 | 2251534 | 110818 | 20.3174 |
86 | 2290661 | 112920 | 20.2857 |
87 | 2250967 | 111991 | 20.0995 |
88 | 2328138 | 110786 | 21.0147 |
89 | 2311596 | 106689 | 21.6667 |
90 | 2199089 | 77616 | 28.3329 |
91 | 2213423 | 111305 | 19.8861 |
92 | 2333108 | 109840 | 21.241 |
93 | 2311989 | 107703 | 21.4663 |
94 | 2341274 | 107690 | 21.7409 |
95 | 2283593 | 110682 | 20.632 |
96 | 2317437 | 106339 | 21.7929 |
97 | 2315319 | 105977 | 21.8474 |
98 | 2273963 | 104413 | 21.7785 |
99 | 2295751 | 108463 | 21.1662 |
100 | 2243962 | 105582 | 21.2533 |
101 | 2309450 | 105209 | 21.9511 |
111 | 2218741 | 70241 | 31.5875 |
121 | 2165896 | 70671 | 30.6476 |
131 | 2297927 | 95630 | 24.0294 |
141 | 2309257 | 93943 | 24.5815 |
151 | 2329158 | 88518 | 26.3128 |
161 | 2309916 | 89789 | 25.726 |
171 | 2349716 | 84143 | 27.9253 |
181 | 2347250 | 82425 | 28.4774 |
191 | 2311234 | 84036 | 27.5029 |
201 | 2295824 | 63730 | 36.0242 |
211 | 2154727 | 62980 | 34.2129 |
221 | 2135793 | 64494 | 33.1162 |
231 | 2156401 | 66412 | 32.4701 |
241 | 2164947 | 61557 | 35.1698 |
251 | 2119297 | 64479 | 32.868 |
261 | 2138391 | 62243 | 34.3555 |
271 | 2282530 | 75414 | 30.2667 |
281 | 2316787 | 74672 | 31.0262 |
291 | 2352069 | 72179 | 32.5866 |
301 | 2302920 | 72470 | 31.7776 |
311 | 2321290 | 72639 | 31.9565 |
321 | 2335064 | 70685 | 33.0348 |
331 | 2263090 | 61128 | 37.0222 |
341 | 2145030 | 61502 | 34.8774 |
351 | 2172175 | 59850 | 36.2937 |
361 | 2127900 | 60940 | 34.918 |
371 | 2169882 | 62329 | 34.8134 |
381 | 2272856 | 68155 | 33.3483 |
391 | 2323502 | 68274 | 34.032 |
401 | 2179323 | 59602 | 36.5646 |
411 | 2161370 | 59150 | 36.5405 |
421 | 2134422 | 58843 | 36.2732 |
431 | 2153908 | 57905 | 37.1973 |
441 | 2140810 | 59144 | 36.1966 |
451 | 2154384 | 59933 | 35.9465 |
461 | 2250051 | 61848 | 36.3803 |
471 | 2114652 | 61662 | 34.2942 |
481 | 2128676 | 57681 | 36.9043 |
491 | 2099692 | 58906 | 35.6448 |
501 | 2163136 | 59300 | 36.4778 |
511 | 2196583 | 59124 | 37.1521 |
521 | 2128438 | 60089 | 35.4214 |
531 | 2221164 | 60934 | 36.452 |
541 | 2128907 | 57742 | 36.8693 |
551 | 2179829 | 59252 | 36.7891 |
561 | 2188514 | 59915 | 36.527 |
571 | 2105524 | 56886 | 37.013 |
581 | 2161930 | 61373 | 35.2261 |
591 | 2172255 | 57704 | 37.6448 |
601 | 2174909 | 59123 | 36.7862 |
611 | 2179606 | 59665 | 36.5307 |
621 | 2165962 | 58397 | 37.0903 |
631 | 2109700 | 60746 | 34.7299 |
641 | 2168104 | 62168 | 34.8749 |
651 | 2208296 | 57360 | 38.4989 |
661 | 2133043 | 59806 | 35.666 |
671 | 2153335 | 58695 | 36.6869 |
681 | 2172594 | 57059 | 38.0763 |
691 | 2181433 | 57409 | 37.9981 |
701 | 2130087 | 61668 | 34.5412 |
711 | 2123525 | 62101 | 34.1947 |
721 | 2126458 | 59714 | 35.6107 |
731 | 2195536 | 62000 | 35.4119 |
741 | 2108244 | 56409 | 37.3742 |
751 | 2161197 | 58293 | 37.0747 |
761 | 2163619 | 60613 | 35.6956 |
771 | 2129111 | 57813 | 36.8275 |
781 | 2175257 | 63446 | 34.2852 |
791 | 2160221 | 58597 | 36.8657 |
801 | 2146208 | 60056 | 35.7368 |
811 | 2149232 | 56528 | 38.0207 |
821 | 2162579 | 61437 | 35.1999 |
831 | 2155373 | 57510 | 37.4782 |
841 | 2097751 | 60918 | 34.4357 |
851 | 2143069 | 56413 | 37.9889 |
861 | 2114536 | 59406 | 35.5947 |
871 | 2280573 | 61036 | 37.3644 |
881 | 2284104 | 62072 | 36.7977 |
891 | 2159975 | 62177 | 34.7391 |
901 | 2154022 | 59092 | 36.452 |
911 | 2171611 | 59059 | 36.7702 |
921 | 2131782 | 60929 | 34.988 |
931 | 2302828 | 59953 | 38.4106 |
941 | 2280489 | 62344 | 36.5791 |
951 | 2326718 | 62706 | 37.1052 |
961 | 2181352 | 61061 | 35.7241 |
971 | 2171901 | 58025 | 37.4304 |
981 | 2064172 | 55878 | 36.9407 |
991 | 2150001 | 58007 | 37.0645 |