O que significa "caminho ativo" no contexto do sync.Once?

14

go version: 1.13.4 No código-fonte sync / once.go , os seguintes comentários mencionaram "hot path":

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
}

Minhas perguntas são:

  1. O que "hot path" significa aqui?

  2. O "É o primeiro na estrutura" torna o acesso ao "caminho quente" mais eficiente? Por quê?

Yalou Wang
fonte
Por que preferir colocar o campo primeiro é explicado na última frase. Algo obscuro sobre isso?
Peter Peter

Respostas:

10

Um caminho ativo é uma sequência de instruções executadas com muita frequência.

Ao acessar o primeiro campo de uma estrutura, podemos desreferenciar diretamente o ponteiro da estrutura para acessar o primeiro campo. Para acessar outros campos, precisamos fornecer um deslocamento do primeiro valor, além do ponteiro struct.

No código de máquina, esse deslocamento é um valor adicional a ser transmitido com a instrução que o torna mais longo. O impacto no desempenho é que a CPU deve executar uma adição do deslocamento no ponteiro struct para obter o endereço do valor a acessar.

Assim, o código da máquina para acessar o primeiro campo de uma estrutura é mais compacto e mais rápido.

Observe que isso pressupõe que o layout dos valores do campo na memória seja o mesmo que na definição da estrutura.

chmike
fonte
Você pode expandir a última frase? ou seja, quando não é esse o caso?
colminator 04/12/19
@colminator, um compilador pode decidir alterar a ordem dos campos de uma estrutura na memória para otimizar o espaço de armazenamento, por exemplo. O compilador go não faz isso até onde eu sei.
chmike
11
@chmike thx pela sua excelente resposta. Gostaria de saber se isso significa que devo colocar o campo acessado com frequência em primeiro lugar de uma estrutura no meu trabalho diário de programação?
Yalou Wang 04/12/19
11
@YalouWang Seria uma pequena otimização. Só vale o esforço se o desempenho for importante.
chmike