Heim >Backend-Entwicklung >Golang >Warum sind lokale Go-Slices beim Elementzugriff schneller als lokale Arrays?
Frage:
Trotz der Erwartungen, dass Arrays aufgrund von schneller als Slices sind Empirische Tests zeigen, dass lokale Slices aufgrund ihrer zusammenhängenden Natur deutlich schneller auf ihre Elemente zugreifen als lokale Arrays. Warum ist das so?
Hintergrund:
Es wurde ein Benchmark-Test durchgeführt, um die Leistung beim Zugriff auf Array- und Slice-Elemente, einschließlich globaler und lokaler Varianten, zu vergleichen. Überraschenderweise erwies sich das lokale Slice als die schnellste Option.
Antwort:
Eine Untersuchung der amd64-Assembly des lokalen Arrays und der Slice-Benchmarks offenbart einen potenziellen Schuldigen. Während beide Methoden ähnliche Vorgänge verwenden, lädt die Array-Version bei jedem Zugriff wiederholt die Array-Adresse aus dem Speicher:
LEAQ "".a+1000(SP),BX
Im Gegensatz dazu arbeitet die Slice-Version hauptsächlich mit Registern und führt nur einen anfänglichen Ladevorgang aus dem Speicher durch:
LEAQ (DX)(SI*1),BX
Zusätzlich ruft die Array-Version die Assemblyroutine runtime.duffcopy auf, während dies bei der Slice-Version nicht der Fall ist. Dieser zusätzliche Laufzeitaufruf kann zur langsameren Leistung der Array-Version beitragen.
Zusätzliche Hinweise:
Die beobachtete Leistungsdiskrepanz bleibt unabhängig von Variationen in der Array-/Slice-Größe bestehen. Elementtyp und die Reihenfolge der Benchmark-Ausführung.
Das obige ist der detaillierte Inhalt vonWarum sind lokale Go-Slices beim Elementzugriff schneller als lokale Arrays?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!