ホームページ >バックエンド開発 >Golang >Go の Memset に相当するもの: ゼロ以外の値で配列を効率的に初期化するには?

Go の Memset に相当するもの: ゼロ以外の値で配列を効率的に初期化するには?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-04 02:29:40847ブラウズ

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

Go Analog for Memset

質問:

Go プログラマーは、次のような効率的な方法を模索しています。 C の memset は、基本的なループのように、ゼロ以外の値で配列を初期化します。

答え:

Go には明示的な memset 関数がありませんが、その機能をエミュレートする最適化されたアプローチがあります。

Loop-ベースとなる解決策:

最も単純な代替案は、ループを反復処理することです。配列、各要素に必要な値を割り当てます:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。