Co oznacza „gorąca ścieżka” w kontekście synchronizacji Raz?

14

wersja go: 1.13.4 W kodzie źródłowym sync / once.go następujące komentarze wspominały o „gorącej ścieżce”:

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
}

Moje pytania to:

  1. Co oznacza tutaj „gorąca ścieżka”?

  2. Czy „To pierwsze w strukturze” sprawia, że ​​dostęp do „gorącej ścieżki” jest bardziej wydajny? Dlaczego?

Yalou Wang
źródło
Dlaczego preferowane jest umieszczenie pola na pierwszym miejscu, wyjaśniono w ostatnim zdaniu. Coś w tym niejasnego?
Peter

Odpowiedzi:

10

Gorąca ścieżka to ciąg instrukcji wykonywanych bardzo często.

Uzyskując dostęp do pierwszego pola struktury, możemy bezpośrednio wyrejestrować wskaźnik na strukturę, aby uzyskać dostęp do pierwszego pola. Aby uzyskać dostęp do innych pól, musimy podać przesunięcie od pierwszej wartości oprócz wskaźnika struct.

W kodzie maszynowym to przesunięcie jest dodatkową wartością, którą należy przekazać wraz z instrukcją, która wydłuża go. Wpływ na wydajność polega na tym, że procesor musi wykonać dodanie przesunięcia do wskaźnika struktury, aby uzyskać adres wartości, do której ma uzyskać dostęp.

Zatem kod maszynowy umożliwiający dostęp do pierwszego pola struktury jest bardziej zwarty i szybszy.

Zauważ, że zakłada to, że układ wartości pól w pamięci jest taki sam jak w definicji struktury.

chmike
źródło
Czy potrafisz rozwinąć ostatnie zdanie? tj. kiedy tak nie jest?
kolminator,
@colminator kompilator może zdecydować o zmianie kolejności pól struktury w pamięci, na przykład w celu zoptymalizowania przestrzeni dyskowej. O ile wiem, kompilator go nie robi tego.
chmike,
1
@chmike thx za doskonałą odpowiedź. Chciałbym wiedzieć, czy to oznacza, że ​​powinienem umieścić najczęściej używane pole na pierwszym miejscu struktury w mojej codziennej pracy programistycznej?
Yalou Wang,
1
@YalouWang To byłaby mała optymalizacja. Warto wysiłek tylko wtedy, gdy ważna jest wydajność.
chmike,