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() をお勧めします。
パフォーマンス ベンチマークでは、memsetLoop() に対する memsetRepeat() の優位性が明らかになりました。配列サイズの増加:
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
memset は Go ではネイティブにサポートされていませんが、memsetLoop() と memsetRepeat() は配列を初期化するための効率的な代替手段を提供します。ゼロ以外の値。 copy() を利用した memsetRepeat() は、より大きな配列の最適なソリューションとして浮上します。
以上がGo で配列を効率的に初期化する方法: memset の代替手段?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。