Heim >Backend-Entwicklung >Golang >Warum sind lokale Go-Slices beim Elementzugriff schneller als lokale Arrays?

Warum sind lokale Go-Slices beim Elementzugriff schneller als lokale Arrays?

Susan Sarandon
Susan SarandonOriginal
2024-12-16 02:26:20204Durchsuche

Why Are Local Go Slices Faster Than Local Arrays for Element Access?

Array vs. Slice: Geschwindigkeit des Elementzugriffs

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!

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