ホームページ >バックエンド開発 >Golang >Go では「append()」とスライス代入のどちらが速いですか?

Go では「append()」とスライス代入のどちらが速いですか?

DDD
DDDオリジナル
2024-11-11 01:49:02800ブラウズ

Which is faster in Go: `append()` or slice assignment?

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)」には、次の一連の操作が含まれます。

  1. コピー既存のスライス ヘッダー。
  2. 可変個引数パラメーター (i) の一時スライスを作成します。
  3. 十分な容量 (ベンチマークで提供される) がある場合は、a を再スライスします。
  4. i をa の最後の要素。
  5. ローカル変数のスライス ヘッダーを更新します (a)。

これらの追加の手順により、「a[i] = i」での直接代入と比較してオーバーヘッドが発生します。 ".

結論

スライス操作間のパフォーマンスの違いを理解することは、コード効率を最適化するために重要です。単純な値の割り当ての場合、「a[i] = i」がより効率的な選択であることがわかります。ただし、スライスの拡張が必要な​​場合は、「a = append(a, i)」が適切なアプローチとなります。

以上がGo では「append()」とスライス代入のどちらが速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。