Sé que esto es de bastante tiempo, pero aquí hay una implementación de un subprocedimiento de heapsort en el que el uso de registrar las variables hace que el algoritmo más rápido, al menos usando gcc 4.5.2 para compilar el código
inline void max_heapify(int *H, int i){
char OK = FALSE;
register int l, r, max, hI;
while(!OK){
OK = TRUE;
l = left(i);
r = right(i);
max = i;
if(l <= H[SIZE] && H[l] > H[i]){
max = l;
}
if(r <= H[SIZE] && H[r] > H[max]){
max = r;
}
if(max != i){
OK = FALSE;
hI = H[i];
H[i] = H[max];
H[max] = hI;
i = max;
}
}
}
probé el algortihm con y w sin la palabra reservada del registro antes de los atributos y lo ejecuté para clasificar una matriz al azar con 50,000,000 elementos en mi cuaderno, algunas veces para cada versión.
el uso de registros disminuyó el tiempo de la colección desde ~ 135s a ~ 125s.
También probé con 5,000,000 elementos solamente, pero lo ejecuté más veces.
La versión sin el registro comenzó a 11s pero cada ejecución rebajado el tiempo hasta llegar a 9,65s y se detuvo en ella
la versión con el registro comenzó en el 10s y bajó el tiempo hasta 8,80s.
Creo que tiene algo que ver con la memoria caché. Sin embargo, parece que los registros hacen que el algoritmo sea más rápido por un factor constante
Dado que estas variables son bastante utilizadas a lo largo del algoritmo, al asegurarse de que están en el registro en lugar de dejar este trabajo para el compilador se obtiene un mejor resultado en este caso. Sin embargo, no mejoró tanto el tiempo.
Espero que sea útil para alguien, saludos.
"¿Pueden pasar tres cosas y dos son malas?" ¿Dónde lo he escuchado antes ... ;-) –
Recuerde que el compilador puede ignorar su sugerencia de manera perfecta, no hay nada en el estándar que indique que tiene que poner una variable de registro en un registro. –
también podría ser el caso de que escriba un compilador de fondo y diga "registro" para todos los lugareños en una función hará una función sin apilamiento. eso sería bastante útil, creo. –