用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