golang常用編程組件效率統計

用golang寫了一個stopwatch類,順便用來統計了一下各個編程組件的效率,結論如下(按效率從高到低順序說明):

(統計方法:每個子項運行100萬次

    測試環境:

    windows XPgolang1.3 32bit

    1G DDR2 RAM

    Core2 T7500 2.2G

1.golang自定義函數調用幾乎沒有延時

2.通過atomic庫實現的自旋鎖效率比sync.Mutex高(在資源競爭激烈的情況下這個結論不一定成立,而且自旋鎖比較耗CPU,除非對性能要求很高並且需要多線程安全的資源考慮使用這個優化)

3.sync.RWMutex.Lock()效率表現不佳

4.time.Now()執行效率大概時syscall的一半,表現不算太差

5.cgo一次空函數調用的耗時大概相當於一次簡單系統調用,表現不佳,對調用頻繁性能敏感的函數建議不要使用cgo

6.一次syscall最少相當於3次鎖消耗,代價較大

7.channel用於goroutine通信,發送一次數據代價大概相當於5次鎖,代價較高

8.無緩衝channel效率比較小緩衝channel高,選擇channel的時候,建議要麼使用無緩衝的,要麼把緩衝區稍微定大點

(channel的統計效率不高,也可能是測試用例開兩個線程一個讀一個寫,需要頻繁切換goroutine執行的代價較高,從單goroutine用例chX rw的效率看,大致也接近2次鎖的消耗,還可以接受)

9.從dll中調用一個空函數的消耗,大致相當於5次鎖消耗,代價較大,建議對性能要求敏感的函數慎用

10.某些系統調用效率不是一般低,慎用

 

以上結論給大家參考,下面是詳細統計記錄:

序號 運行項 總耗時 每次
1 go empty_loop 0 0
2 go empty_func 0 0
3 go with ret 0 0
4 no_sync_rand 0 0
5 spin lock rand 31.25ms 31ns
6 sync.Mutex 62.5ms 62ns
7 sync.RMutex 62.5ms 62ns
8 ch3 rw 203.125ms 101ns
9 ch100 rw 203.125ms 101ns
10 sync.WMutex 109.375ms 109ns
11 ch1 rw 218.75ms 109ns
12 ch2 rw 218.75ms 109ns
13 ch5 rw 218.75ms 109ns
14 ch10 rw 234.375ms 117ns
15 std_time 140.625ms 140ns
16 c.RDTSC 250ms 250ns
17 cgo empty_func 265.625ms 265ns
18 cgo with ret 281.25ms 281ns
19 c.Clock 296.875ms 296ns
20 syscall.GetLastError 312.5ms 312ns
21 ch10 write 328.125ms 328ns
22 ch100 read 328.125ms 328ns
23 ch5 write 343.75ms 343ns
24 dll.empty_func 343.75ms 343ns
25 dll.return_func 343.75ms 343ns
26 ch100 write 359.375ms 359ns
27 ch10 read 406.25ms 406ns
28 ch0 write 421.875ms 421ns
29 ch0 read 421.875ms 421ns
30 ch5 read 421.875ms 421ns
31 ch3 read 515.625ms 515ns
32 ch2 write 562.5ms 562ns
33 ch2 read 593.75ms 593ns
34 ch3 write 671.875ms 671ns
35 ch1 write 812.5ms 812ns
36 ch1 read 875ms 875ns
37 syscall.ComputerName 140.625ms 140.625us
發佈了23 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章