Was bedeutet "Hot Path" im Kontext von sync.Once?

14

go version: 1.13.4 Im Quellcode sync / Once.go wurde in den folgenden Kommentaren "Hot Path" erwähnt:

type Once struct {
    // done indicates whether the action has been performed.
    // It is first in the struct because it is used in the hot path.
    // The hot path is inlined at every call site.
    // Placing done first allows more compact instructions on some architectures (amd64/x86),
    // and fewer instructions (to calculate offset) on other architectures.
    done uint32
    m    Mutex
}

Meine Fragen sind:

  1. Was bedeutet "heißer Weg" hier?

  2. Macht "Es ist das erste in der Struktur" einen "Hot Path" -Zugriff effizienter? Warum?

Yalou Wang
quelle
Warum es vorzuziehen ist, das Feld an die erste Stelle zu setzen, wird im letzten Satz erläutert. Ist da etwas unklar?
Peter

Antworten:

10

Ein Hot Path ist eine Folge von Anweisungen, die sehr häufig ausgeführt werden.

Beim Zugriff auf das erste Feld einer Struktur können wir den Zeiger direkt auf die Struktur dereferenzieren, um auf das erste Feld zuzugreifen. Um auf andere Felder zugreifen zu können, müssen wir zusätzlich zum Strukturzeiger einen Versatz vom ersten Wert angeben.

Im Maschinencode ist dieser Offset ein zusätzlicher Wert, der mit der Anweisung übergeben werden muss, wodurch er länger wird. Die Auswirkung auf die Leistung besteht darin, dass die CPU den Offset zum Strukturzeiger addieren muss, um die Adresse des Werts abzurufen, auf den zugegriffen werden soll.

Somit ist der Maschinencode für den Zugriff auf das erste Feld einer Struktur kompakter und schneller.

Beachten Sie, dass dies voraussetzt, dass das Layout der Feldwerte im Speicher das gleiche ist wie in der Strukturdefinition.

chmike
quelle
Können Sie den letzten Satz erweitern? Wann ist das nicht der Fall?
Colminator
@colminator Ein Compiler könnte entscheiden, die Feldreihenfolge einer Struktur im Speicher zu ändern, um beispielsweise den Speicherplatz zu optimieren. Der go-Compiler macht das meines Wissens nicht.
Chmike
1
@chmike thx für deine ausgezeichnete Antwort. Ich würde gerne wissen, bedeutet dies, dass ich das Feld, auf das häufig zugegriffen wird, in meiner täglichen Programmierarbeit an die erste Stelle einer Struktur setzen sollte?
Yalou Wang
1
@ YalouWang Es wäre eine kleine Optimierung. Die Mühe lohnt sich nur, wenn Leistung wichtig ist.
chmike