ホームページ >バックエンド開発 >Golang >Go ではスライスの割り当てはスライスの追加よりも常に高速ですか?

Go ではスライスの割り当てはスライスの追加よりも常に高速ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-12 10:19:02974ブラウズ

Is Slice Assignment Always Faster Than Slice Append in Go?

パフォーマンスの比較: Go でのスライスの追加と割り当て

Go でスライスを操作する場合、要素の追加や割り当てなどの操作は重要な影響を与える可能性があります。パフォーマンスへの影響。スライスの追加には 2 つの一般的なメソッドが使用できます:

append(slice, value): この関数は、新しい要素を収容できる拡張容量を持つ新しいスライスを作成し、既存の要素をnew slide.

slice[index] = value: この割り当ては、スライスの指定されたインデックスにある要素を、

これら 2 つのアプローチのパフォーマンスを比較するために、次の 2 つのベンチマーク関数が作成されました:

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
    }
}

結果は、slice[index] = value は append(slice, value):

BenchmarkSliceAppend-4  200000000                7.87 ns/op            8 B/op          0 allocs/op
BenchmarkSliceSet-4     300000000                5.76 ns/op            8 B/op

パフォーマンスの違いを理解する

スライスの割り当てがスライスの追加よりも速いのはなぜですか?主な違いは、割り当てがコピーや再割り当てを必要とせずに既存のスライスを変更する単純なインプレース操作であるという事実です。

一方、追加関数にはいくつかの手順が含まれます。

    既存のスライス ヘッダーのコピー
  1. 可変長引数の一時スライスの作成パラメータ
  2. 必要に応じて既存のスライスを再スライス
  3. スライスの要素に新しい値を代入
  4. 新しいスライスを返し、ローカル変数に代入します
これらのステップの一部が最適化またはインライン化されている場合でも、各ループ反復でローカル スライス変数を更新する必要性が追加されます。単純な代入操作と比較した計算オーバーヘッド。

以上がGo ではスライスの割り当てはスライスの追加よりも常に高速ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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