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