Go のスライス操作では、直接代入の方が追加より速いですか?

DDD
リリース: 2024-11-10 06:41:02
オリジナル
702 人が閲覧しました

Is Direct Assignment Faster than Append for Slice Operations in Go?

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
ログイン後にコピー

代入は追加よりも速いのはなぜですか?

パフォーマンスの違いは、各メソッドによって実行される個別の操作に起因します。

  • 直接代入 (a[i] = i) ): これは、スライスの i 番目の要素の値を i に設定するだけです。
  • Append (a = append(a, i)): この関数には以下が含まれますより複雑なプロセス:

    1. 組み込みの追加関数を呼び出し、新しいスライス ヘッダーと可変引数パラメーターの一時スライスを作成します。
    2. 十分なスライスがある場合は、既存のスライスを再スライスします。
    3. i を新しいスライスの最後の要素に割り当てます。
    4. 新しいスライスを参照するようにローカル変数 a を更新します。

要約すると、各追加操作にはスライス ヘッダーのコピーと一時スライスの作成に追加のオーバーヘッドがかかりますが、直接割り当てでは既存のスライス要素が変更されるだけです。このオーバーヘッドは、観察されるパフォーマンスの違いに影響します。

推奨事項

スライスに追加するときに最適なパフォーマンスを得るには、繰り返し使用するのではなく、make を使用して十分な容量を事前に割り当てることをお勧めします。追加機能。これにより、動的なメモリ割り当てと再スライスの必要がなくなり、効率が大幅に向上します。

以上がGo のスライス操作では、直接代入の方が追加より速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート