Go でのスライス追加操作の高速化
Go では、スライスは値のシーケンスを格納する重要なデータ構造です。要素をスライスに追加するときは、パフォーマンスを最適化することが不可欠です。この記事では、スライスに追加する 2 つの方法、追加と直接代入 (=) のパフォーマンスの違いを調査します。
ベンチマーク分析
パフォーマンスを比較するために、以下を実行しました。次のコードを使用した 2 つのベンチマーク:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) // Create an empty slice with sufficient capacity for i := 0; i < b.N; i++ { a = append(a, i) // Append i to the slice } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) // Create a slice with size b.N for i := 0; i < b.N; i++ { a[i] = i // Assign i to the slice's ith element } }
ベンチマークの結果は、直接代入 (a[i] = i) が追加を使用するよりも大幅に高速であることを示しています:
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
代入は追加よりも速いのはなぜですか?
パフォーマンスの違いは、各メソッドによって実行される個別の操作に起因します。
Append (a = append(a, i)): この関数には以下が含まれますより複雑なプロセス:
要約すると、各追加操作にはスライス ヘッダーのコピーと一時スライスの作成に追加のオーバーヘッドがかかりますが、直接割り当てでは既存のスライス要素が変更されるだけです。このオーバーヘッドは、観察されるパフォーマンスの違いに影響します。
推奨事項
スライスに追加するときに最適なパフォーマンスを得るには、繰り返し使用するのではなく、make を使用して十分な容量を事前に割り当てることをお勧めします。追加機能。これにより、動的なメモリ割り当てと再スライスの必要がなくなり、効率が大幅に向上します。
以上がGo のスライス操作では、直接代入の方が追加より速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。