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