Go Analog for Memset
问题:
Go 程序员寻求一种类似于以下的有效方法C 的 memset 用非零值初始化数组,就像基本循环一样慢。
答案:
虽然 Go 缺乏显式的 memset 函数,但有模拟其功能的优化方法。
循环 -基于解决方案:
最简单的替代方案是迭代的循环数组,为每个元素分配所需的值:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
基于复制的解决方案:
Go 优化的 copy() 函数可用于快速初始化数组。通过手动设置第一个元素并重复复制填充部分,迭代次数减少为log(n):
func memsetRepeat(a []int, v int) { if len(a) == 0 { return } a[0] = v for bp := 1; bp < len(a); bp *= 2 { copy(a[bp:], a[:bp]) } }
性能对比:
For对于小数组,基于循环的解决方案稍微快一些。然而,随着数组大小的增加,基于副本的解决方案由于迭代次数减少而变得明显更快。
基准结果:
Array Size | Loop-Based | Copy-Based |
---|---|---|
100 elements | 1.15x slower | |
1,000 elements | 2.5x slower | |
10,000 elements | 2x slower | |
100,000 elements | 1.5x slower |
以上是Go 的 Memset 等效项:如何高效地初始化非零值数组?的详细内容。更多信息请关注PHP中文网其他相关文章!