Go随笔 | Copy && Append
很多时候我们需要对数据进行复制,在申请新的内存空间之后,我们可以用copy、append、for来复制拷贝。性能如何呢?
拷贝测试
|
|
测试结果如下:
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
BenchmarkCopyArray-16 453242040 2.650 ns/op 0 B/op 0 allocs/op
BenchmarkAppendArray-16 340650312 3.513 ns/op 0 B/op 0 allocs/op
BenchmarkLoopAppendArray-16 24512456 48.90 ns/op 0 B/op 0 allocs/op
BenchmarkLoopArray-16 22199775 54.54 ns/op 0 B/op 0 allocs/op
如果将上面Append相关示例修改一下:
|
|
上面不用局部变量代理slice,测试结果如下:
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
BenchmarkCopyArray-16 454175919 2.642 ns/op 0 B/op 0 allocs/op
BenchmarkAppendArray-16 339231340 3.505 ns/op 0 B/op 0 allocs/op
BenchmarkLoopAppendArray-16 18401294 65.28 ns/op 0 B/op 0 allocs/op
BenchmarkLoopArray-16 22653690 52.94 ns/op 0 B/op 0 allocs/op
为什么会出现性能下降的问题呢?因为局部一般用寄存器存储计算,速度快于堆栈内存存取速度。
结论:
- Copy的性能比Append略好。
- 能一次Copy批量复制值,绝对不要循环单个复制。
- 循环处理数据,特别涉及修改值而且循环次数过多时,要想办法用局部变量做代理。
(完)
- 原文作者: 闪电侠
- 原文链接:https://chende.ren/2023/04/06110148-011-copy-append.html
- 版权声明:本作品采用 开放的「署名 4.0 国际 (CC BY 4.0)」创作共享协议 进行许可