Heim >Backend-Entwicklung >Golang >Ist die direkte Zuweisung schneller als das Anhängen für Slice-Vorgänge in Go?

Ist die direkte Zuweisung schneller als das Anhängen für Slice-Vorgänge in Go?

DDD
DDDOriginal
2024-11-10 06:41:02763Durchsuche

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

Beschleunigung von Slice-Anhängeoperationen in Go

In Go sind Slices wichtige Datenstrukturen, die Sequenzen von Werten speichern. Beim Anhängen von Elementen an ein Slice ist es wichtig, die Leistung zu optimieren. In diesem Artikel wird der Leistungsunterschied zwischen zwei Methoden zum Anhängen an ein Slice untersucht: Anhängen und direkte Zuweisung (=).

Benchmark-Analyse

Um die Leistung zu vergleichen, haben wir ausgeführt zwei Benchmarks mit dem folgenden Code:

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

Die Benchmark-Ergebnisse zeigen, dass die direkte Zuweisung (a[i] = i) deutlich schneller ist als die Verwendung anhängen:

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

Warum ist die Zuweisung schneller als das Anhängen?

Der Leistungsunterschied ergibt sich aus den unterschiedlichen Vorgängen, die von jeder Methode ausgeführt werden:

  • Direkte Zuweisung (a[i] = i): Dies legt einfach den Wert des i-ten Elements des Slice fest zu i.
  • Append (a = append(a, i)): Diese Funktion beinhaltet einen komplexeren Prozess:

    1. Ruft das Gebaute auf -in Append-Funktion, die einen neuen Slice-Header und einen temporären Slice für den Variadic-Parameter erstellt.
    2. Slices des vorhandenen Slice neu, wenn ausreichend vorhanden ist Kapazität.
    3. Weist i dem letzten Element des neuen Slice zu.
    4. Aktualisiert die lokale Variable a, um auf das neue Slice zu verweisen.

Zusammenfassend lässt sich sagen, dass jeder Anhängevorgang zusätzlichen Aufwand beim Kopieren des Slice-Headers und beim Erstellen temporärer Slices mit sich bringt, während die direkte Zuweisung lediglich das vorhandene Slice-Element ändert. Dieser Overhead trägt zum beobachteten Leistungsunterschied bei.

Empfehlung

Für eine optimale Leistung beim Anhängen an Slices wird empfohlen, ausreichend Kapazität vorab mit make zuzuweisen, anstatt wiederholt mit zu verwenden die Append-Funktion. Dadurch entfällt die Notwendigkeit einer dynamischen Speicherzuweisung und Neuaufteilung, was die Effizienz erheblich verbessert.

Das obige ist der detaillierte Inhalt vonIst die direkte Zuweisung schneller als das Anhängen für Slice-Vorgänge in Go?. 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