在 C 中,memset 函数可以高效地使用指定值初始化数组。然而,Go 缺乏直接的 memset 支持。本文探讨了实现类似功能的几种替代方法。
使用循环的简单实现是:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
优化方法利用高效的 copy() 函数:
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]) } }
此解决方案类似于 bytes.Repeat() 的实现。要创建填充相同值的新 []byte,建议使用 bytes.Repeat()。
性能基准揭示了 memsetRepeat() 相对于 memsetLoop() 的优越性,因为数组大小增加:
Array Size | memsetLoop | memsetRepeat | Improvement |
---|---|---|---|
100 | ~1.15x slower | ~1.15x faster | |
1,000 | ~2.5x slower | ~2.5x faster | |
10,000 | ~2x slower | ~2x faster | |
100,000 | ~1.5x slower | ~1.5x faster |
大约 3800-4000 个元素, memsetRepeat() 提供了约 3.2 倍的性能提升。
虽然 Go 本身不支持 memset,但 memsetLoop() 和 memsetRepeat() 为使用非初始化数组提供了有效的替代方案零值。 memsetRepeat(),利用 copy(),成为较大数组的最佳解决方案。
以上是如何在 Go 中高效初始化数组:memset 替代方案?的详细内容。更多信息请关注PHP中文网其他相关文章!