Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小。充分将goroutine复用,减少goroutine的创建/销毁的性能损耗,这便是grpool对goroutine进行池化封装的目的。例如,针对于100W个执行任务,使用goroutine的话需要不停创建并销毁100W个goroutine,而使用grpool也许底层只需要几千个goroutine便能充分复用地执行完成所有任务。经测试,在高并发下grpool的性能比原生的goroutine高出几倍到数百倍!并且随之也极大地降低了内存使用率。
测试环境
系统:Ubuntu Desktop 14.04.5 x64 LTS
芯片:Intel(R) Core(TM) i7-7700K
硬盘:Intel SSD 256G
内存:8G
软件:grpool
测试结果
使用的测试函数都是同一个,功能是从0累加到100W,函数定义如下:
func increment() { for i := 0; i < 1000000; i++ {} } |
1、Benchmark测试
脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb1_test.go
john@johnstation:~$ go test *.go -bench=".*" -benchmem mem usage: 23680 mem usage: 236013 goos: linux goarch: amd64 BenchmarkGrpool_1-8 10000000 174 ns/op 48 B/op 1 allocs/op BenchmarkGoroutine_1-8 1000000 57464 ns/op 413 B/op 0 allocs/op |
2、Benchmark测试,固定任务量
脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb2_test.go
本次测试任然采用benchmark的方式,不过每一次都固定了任务量,例如任务量为10000的测试中,benchmark会对方法进行连续12×10000的调用测试。
使用goroutine无法完成500W个benchmark测试任务,消耗完毕12G(6G物理+6G虚拟)内存也不够用,因此这里的测试结果只统计到100W个benchmark测试任务。
3、内存使用量测试(KBytes)
脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_test.go
通过在测试脚本中嵌入runtime来获取当前进程的内存使用量。
使用goroutine无法完成500W个执行任务,消耗完毕12G(6G物理+6G虚拟)内存也不够用,因此这里的测试结果只统计到100W个执行任务。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。