首页 >后端开发 >Golang >Go 的 Memset 等效项:如何高效地初始化非零值数组?

Go 的 Memset 等效项:如何高效地初始化非零值数组?

Barbara Streisand
Barbara Streisand原创
2025-01-04 02:29:40801浏览

Go's Memset Equivalent: How to Efficiently Initialize Arrays with Non-Zero Values?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn