假设有一个长度为1000的Slice,里面存了很多数据,为了高效地处理这些数据,我需要将它重新分割为10个长度为100的Slice,然后开10个Goroutine来并行处理。那么,如何以固定容量切分这个Slice呢?
简单写法
1 | type T struct { |
但这种写法并不高效:由于没有提前分配v的容量,执行append
时如果v的容量不够,会自动将v的容量翻倍,这就导致了内存的重新分配以及多余的内存占用,而内存的分配相对而言是非常耗时的。
高效写法
1 | func IntChunkOptimized(origins []T, limit int) [][]T { |
究竟有多大提升?写个Benchmark测试一下吧
1 | func BenchmarkIntChunk(b *testing.B) { |
在我的MacBook Pro(CPU: 2.7 GHz Intel Core i5, 内存: 8 GB 1867 MHz DDR3)上测试得到以下结果
可见,改进后的方法提升了2~7倍的执行效率,效果显著!