golang sync.Map和map+mutex性能比較

目錄

 

測試環境

測試代碼

運行指令

測試結果

結論


測試環境

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

測試結果

sync.Map和map+Mutex性能對比
測試序號 說明 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章