texto lenguaje imprimir gotoxy espacio con como centrar blanco alineado c++ c++11

lenguaje - ¿La alineación realmente importa para el rendimiento en C++ 11?



imprimir alineado en c (2)

¿La alineación realmente importa para el rendimiento en C ++ 11?

Hay un consejo en el libro de Stroustrup para ordenar a los miembros en una estructura que comienza desde la más grande hasta la más pequeña. Pero me pregunto si alguien ha hecho mediciones para ver realmente si esto hace alguna diferencia, y si vale la pena pensar al escribir el código.


La alineación es importante no solo para el rendimiento, sino también para la corrección. Algunas arquitecturas fallarán con una trampa de procesador si los datos no están alineados correctamente o si acceden a la ubicación incorrecta de la memoria. En otros, el acceso a variables desalineadas se divide en múltiples accesos y cambios de bits (a menudo dentro del hardware, a veces por el controlador de trampas del sistema operativo), perdiendo atomicidad.

El consejo para clasificar a los miembros en orden descendente de tamaño es para un empaque / espacio mínimo desperdiciado por el relleno, no por la alineación o la velocidad. Los miembros estarán alineados correctamente, sin importar el orden en que los incluyas, a menos que solicites un diseño no conforme usando pragmas especializados (es decir, el #pragma pack no portátil) o palabras clave. Aunque el tamaño total de la estructura se ve afectado por el relleno y también afecta la velocidad, a menudo hay otro orden que es óptimo.

Para obtener el mejor rendimiento, intente obtener miembros que se utilicen juntos en la misma línea de caché y miembros a los que accedan diferentes subprocesos en diferentes líneas de caché. A veces eso significa una gran cantidad de relleno para obtener una variable compartida de hilo cruzado solo en su propia línea de caché. Pero eso es mejor que tomar un golpe de rendimiento del intercambio falso.


Solo para agregar a la gran respuesta de Ben:

Definir los miembros de la estructura en el mismo orden en el que se accede posteriormente a ellos en la aplicación reducirá las fallas de la memoria caché y posiblemente aumentará el rendimiento. Esto funcionará siempre que toda la estructura no encaje en la memoria caché L1.

Por otro lado, ordenar los miembros de mayor a menor puede reducir el uso general de la memoria, lo que puede ser importante al almacenar una serie de estructuras pequeñas.

Supongamos que para una arquitectura (no los conozco tan bien, creo que sería el caso para las configuraciones predeterminadas de 32 bits gcc, alguien me corregirá en los comentarios) esta estructura:

struct MemoryUnused { uint8_t val0; uint16_t val1; uint8_t val2; uint16_t val3; uint8_t val4; uint32_t val5; uint8_t val6; }

toma 20 bytes en la memoria, mientras esto:

struct MemoryNotLost { uint32_t val5; uint16_t val1; uint16_t val3; uint8_t val0; uint8_t val2; uint8_t val4; uint8_t val6; }

Tomará 12. Eso es 8 bytes perdidos debido al relleno, y es un aumento del 67% en el tamaño de la estructura más pequeña. Con una gran variedad de tales estructuras, la ganancia sería significativa y, simplemente debido a la cantidad de memoria utilizada, disminuirá la cantidad de errores de caché.