¿Qué significa "ruta de acceso" en el contexto de la sincronización.

14

go version: 1.13.4 En el código fuente sync / once.go , los siguientes comentarios mencionan "ruta de acceso":

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
}

Mis preguntas son:

  1. ¿Qué significa "ruta caliente" aquí?

  2. ¿"Es el primero en la estructura" hace que un acceso de "ruta caliente" sea más eficiente? ¿Por qué?

Yalou Wang
fuente
Por qué es preferible colocar el campo primero se explica en la última oración. ¿Algo poco claro sobre eso?
Peter

Respuestas:

10

Una ruta activa es una secuencia de instrucciones ejecutadas con mucha frecuencia.

Al acceder al primer campo de una estructura, podemos desreferenciar directamente el puntero a la estructura para acceder al primer campo. Para acceder a otros campos, necesitamos proporcionar un desplazamiento desde el primer valor además del puntero de estructura.

En el código de máquina, este desplazamiento es un valor adicional para pasar con la instrucción que lo hace más largo. El impacto en el rendimiento es que la CPU debe realizar una adición del desplazamiento al puntero de estructura para obtener la dirección del valor para acceder.

Por lo tanto, el código de máquina para acceder al primer campo de una estructura es más compacto y más rápido.

Tenga en cuenta que esto supone que el diseño de los valores de campo en la memoria es el mismo que en la definición de estructura.

chmike
fuente
¿Puedes ampliar la última oración? es decir, ¿cuándo no es ese el caso?
Colminador
@colminator un compilador podría decidir cambiar el orden de campo de una estructura en la memoria para optimizar el espacio de almacenamiento, por ejemplo. El compilador go no hace eso hasta donde yo sé.
chmike
1
@chmike thx por tu excelente respuesta. Me gustaría saber ¿significa que debería poner el campo de acceso frecuente en primer lugar de una estructura en mi trabajo de programación diaria?
Yalou Wang
1
@YalouWang Sería una pequeña optimización. Solo vale la pena el esfuerzo si el rendimiento es importante.
chmike