C の memset 関数に相当する Go 関数はありますか?
C では、 memset を使用して特定の値で配列を初期化できます。 。この機能は特に効率的です。 Go では、配列またはスライスをすべてゼロで初期化するのは、make([]int, 1000000); を使用することで簡単です。ただし、ゼロ以外の値で初期化するオプションは提供されません。
ループを手動初期化に使用できますが、memset の効率が欠けています。
memset アナログGo の場合:
1.ループベースのアプローチ:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
2. copy() ベースのアプローチ (推奨):
copy() 関数は高度に最適化されており、memset のような操作に利用できます。
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]) } }
このソリューションは、最初の要素を手動で削除し、copy() を使用して設定済みの部分を未設定の部分にコピーします。このアルゴリズムは 2 倍手法を使用して、log(n) の反復回数を減らします。
ベンチマーク:
memsetRepeat() と memsetLoop() のベンチマークでは、顕著なパフォーマンスが示されています。要素数、特に 3800 ~ 4000 あたりが増加すると、memsetRepeat() が有利になります。 elements.
追加の注意:
小さなスライスの場合、memsetLoop() のパフォーマンスがわずかに向上する可能性があります。ただし、memsetRepeat() は、スライスが大きくなるとパフォーマンスが大幅に向上します。
以上がC の memset に相当する高速で効率的な Go はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。