用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 |