Что означает «горячий путь» в контексте sync.Once?

14

go version: 1.13.4 В исходном коде sync / once.go в следующих комментариях упоминается «горячий путь»:

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
}

Мои вопросы:

  1. Что значит «горячий путь» здесь?

  2. Делает ли «Это первым в структуре» доступ по «горячему пути» более эффективным? Почему?

Ялу Ван
источник
Почему размещение поля первым предпочтительнее, объясняется в последнем предложении. Что-нибудь неясно об этом?
Питер

Ответы:

10

Горячий путь - это последовательность инструкций, выполняемых очень часто.

При доступе к первому полю структуры мы можем напрямую разыменовать указатель на структуру для доступа к первому полю. Чтобы получить доступ к другим полям, нам нужно предоставить смещение от первого значения в дополнение к указателю структуры.

В машинном коде это смещение является дополнительным значением для передачи инструкции, что делает его длиннее. Влияние на производительность заключается в том, что ЦП должен выполнить добавление смещения к указателю структуры, чтобы получить адрес доступного значения.

Таким образом, машинный код для доступа к первому полю структуры более компактен и быстрее.

Обратите внимание, что это предполагает, что расположение значений поля в памяти такое же, как в определении структуры.

chmike
источник
Можете ли вы расширить последнее предложение? т.е. когда это не так?
colminator
@colminator, компилятор может решить изменить порядок полей структуры в памяти, например, для оптимизации пространства хранения. Насколько я знаю, компилятор go не делает этого.
Чмике
1
@chmike спасибо за отличный ответ. Я хотел бы знать, означает ли это, что я должен поставить часто используемое поле на первое место структуры в моей повседневной работе по программированию?
Ялу Ван
1
@YalouWang Это была бы небольшая оптимизация. Это стоит усилий, если важна производительность.
chmike