Go でのスライスの追加と割り当てのパフォーマンスの比較
Go では、スライスはデータを効率的に管理する上で重要な役割を果たします。ただし、一般的に使用される 2 つのスライス操作、追加と代入のパフォーマンスの違いに関して疑問が生じます。
追加と割り当て
append() 操作は既存のスライスを拡張します。要素を追加する場合、代入演算子 (=) をスライスに適用すると、既存の要素が新しい値で単純に上書きされます。
パフォーマンス分析
次のコードのベンチマークパフォーマンスのギャップを示します:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) for i := 0; i < b.N; i++ { a = append(a, i) } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) for i := 0; i < b.N; i++ { a[i] = i } }
ベンチマーク結果は、"a[i] = i" (代入) が常に "a = append(a, i)" (追加) よりも優れていることを示しています:
BenchmarkSliceAppend 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet 300000000 5.76 ns/op 8 B/op
説明
「a[i] = i」の高速なパフォーマンスは、その直接代入の性質に起因すると考えられます。これは、スライス内の対応する要素に値 i を割り当てるだけです。
対照的に、「a = append(a, i)」には、次の一連の操作が含まれます。
これらの追加の手順により、「a[i] = i」での直接代入と比較してオーバーヘッドが発生します。 ".
結論
スライス操作間のパフォーマンスの違いを理解することは、コード効率を最適化するために重要です。単純な値の割り当ての場合、「a[i] = i」がより効率的な選択であることがわかります。ただし、スライスの拡張が必要な場合は、「a = append(a, i)」が適切なアプローチとなります。
以上がGo では「append()」とスライス代入のどちらが速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。