Heim  >  Artikel  >  Backend-Entwicklung  >  Ist die Slice-Zuweisung in Go immer schneller als das Slice-Anhängen?

Ist die Slice-Zuweisung in Go immer schneller als das Slice-Anhängen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-12 10:19:02929Durchsuche

Is Slice Assignment Always Faster Than Slice Append in Go?

Leistungsvergleich: Slice-Anhängen vs. Zuweisen in Go

Beim Arbeiten mit Slices in Go können Vorgänge wie das Anhängen und Zuweisen von Elementen von Bedeutung sein Auswirkungen auf die Leistung. Für das Slice-Anhängen stehen zwei gängige Methoden zur Verfügung:

append(slice, value): Diese Funktion erstellt ein neues Slice mit einer erweiterten Kapazität zur Aufnahme des neuen Elements und kopiert die vorhandenen Elemente in das neues Slice.

slice[index] = value: Diese Zuweisung ändert direkt das Element am angegebenen Index des Slice, ohne eine neue Kopie zu erstellen.

Zum Vergleichen der Leistung dieser beiden Ansätze wurden die folgenden zwei Benchmark-Funktionen erstellt:

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

Die Ergebnisse zeigen, dass slice[index] = value deutlich schneller ist als append(slice, Wert):

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

Den Leistungsunterschied verstehen

Warum ist die Slice-Zuweisung schneller als das Slice-Anhängen? Der Hauptunterschied besteht darin, dass die Zuweisung ein einfacher direkter Vorgang ist, der den vorhandenen Slice ändert, ohne dass Kopien oder Neuzuweisungen erforderlich sind.

Andererseits umfasst die Anhängefunktion mehrere Schritte:

  1. Kopieren des vorhandenen Slice-Headers
  2. Erstellen eines temporären Slice für den variadic-Parameter
  3. Neues Slicen des vorhandenen Slice bei Bedarf
  4. Zuweisen des neuen Werts zu einem Element von das Slice
  5. Ein neues Slice zurückgeben, das dann der lokalen Variablen zugewiesen wird

Auch wenn einige dieser Schritte optimiert oder inline sind, besteht die Notwendigkeit, die lokale Slice-Variable zu aktualisieren Jede Schleifeniteration erhöht den Rechenaufwand im Vergleich zur einfacheren Zuweisungsoperation.

Das obige ist der detaillierte Inhalt vonIst die Slice-Zuweisung in Go immer schneller als das Slice-Anhängen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn