Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist in Go schneller: „append()“ oder Slice-Zuweisung?

Was ist in Go schneller: „append()“ oder Slice-Zuweisung?

DDD
DDDOriginal
2024-11-11 01:49:02727Durchsuche

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

Leistungsvergleich von Slice-Anhang und -Zuweisung in Go

In Go spielt Slicing eine wichtige Rolle bei der effizienten Datenverwaltung. Es stellen sich jedoch Fragen zu den Leistungsunterschieden zwischen zwei häufig verwendeten Slice-Operationen: Anhängen und Zuweisen.

Anhängen vs. Zuweisen

Die Operation append() erweitert das vorhandene Slice mit zusätzlichen Elementen, während der Zuweisungsoperator (=) bei Anwendung auf Slices einfach die vorhandenen Elemente mit neuen Werten überschreibt.

Leistungsanalyse

Benchmarking des folgenden Codes zeigt die Leistungslücke:

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

Benchmark-Ergebnisse zeigen, dass „a[i] = i“ (Zuweisung) „a = append(a, i)“ (anhängen) durchweg übertrifft:

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

Erklärung

Die schnellere Leistung von „a[i] = i“ kann auf die direkte Zuweisung zurückgeführt werden. Es weist einfach den Wert i dem entsprechenden Element im Slice zu.

Im Gegensatz dazu umfasst „a = append(a, i)“ eine Reihe von Operationen:

  1. Kopieren Sie die vorhandener Slice-Header.
  2. Erstellen Sie einen temporären Slice für verschiedene Parameter (i).
  3. Slice a erneut, wenn genügend Kapazität vorhanden ist (im Benchmark bereitgestellt).
  4. Weisen Sie i dem zu letztes Element von a.
  5. Aktualisieren Sie den Slice-Header in einer lokalen Variablen (a).

Diese zusätzlichen Schritte führen im Vergleich zur direkten Zuweisung in „a[i] = i“ zu einem Mehraufwand ".

Fazit

Das Verständnis der Leistungsunterschiede zwischen Slice-Operationen ist entscheidend für die Optimierung der Codeeffizienz. Für eine einfache Wertzuweisung erweist sich „a[i] = i“ als effizientere Wahl. Wenn jedoch eine Erweiterung des Slice erforderlich ist, bleibt „a = append(a, i)“ der geeignete Ansatz.

Das obige ist der detaillierte Inhalt vonWas ist in Go schneller: „append()“ oder Slice-Zuweisung?. 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