Los bucles de desenrollado manual pueden ser ineficaces en procesadores más nuevos pero pueden ser útiles en GPU y arquitecturas ligeras como ARM, ya que no son tan buenos como los procesadores de CPU actuales en predicción y porque las pruebas y saltos realmente desperdician ciclos en aquellos procesadores.
Dicho esto, solo se debe hacer en bucles muy estrechos y en bloques, porque al desenrollar se está hinchando significativamente el tamaño del código y esto hará que la memoria caché en dispositivos pequeños y terminará con un problema mucho peor en su mano.
Una nota de advertencia, sin embargo, desenrollar un bucle debería ser el último recurso al optimizar. Pervierte su código a un nivel que lo hace inmanejable y alguien que lo lea podría romperse y amenazarlo a usted y a su familia más adelante. Sabiendo eso, haz que valga la pena :)
El uso de macros puede ser de gran ayuda para hacer que el código sea más legible y hará que el desenrollado sea deliberado.
Ejemplo:
for(int i=0; i<256; i++)
{
a+=(ptr + i) << 8;
a-=(ptr + i - k) << 8;
// And possibly some more
}
Se puede desenrollar a:
#define UNROLL (i) \
a+=(ptr[i]) << 8; \
a-=(ptr[i-k]) << 8;
for(int i=0; i<32; i++)
{
UNROLL(i);
UNROLL(i+1);
UNROLL(i+2);
UNROLL(i+3);
UNROLL(i+4);
UNROLL(i+5);
UNROLL(i+6);
UNROLL(i+7);
}
En una nota relacionada, pero todavía algo relacionado, si realmente desea ganar en el lado cómputo de instrucciones, asegúrese de que todas las constantes consiguen unificado en menos inmediatos como sea posible en su código para que no termine con el siguiente ensamblaje:
// Bad
MOV r1, 4
// ...
ADD r2, r2, 1
// ...
ADD r2, r2, 4
En lugar de:
// Better
ADD r2, r2, 8
Por lo general, los compiladores graves a protegerse contra este tipo de cosas, pero no todos lo harán. Mantenga los '#define', 'enum' y 'static const' a mano, no todos los compiladores optimizarán las variables 'const' locales.
Utilizaría la palabra notable para el dispositivo Duffs ;-). –
que también sería una palabra adecuada sí :-) –
Aunque es inteligente, creo que el dispositivo de Duff es una construcción de código incorrecta.No hay una ventaja de velocidad real de su estructura con respecto a la declaración de cambio. Dos bucles consecutivos, uno desenrollado y el otro no para manejar el redondeo, ES MUCHO más evidente y no depende de las posibilidades de sintaxis impar de C –