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:
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!