Pregunta

Estoy leyendo K & amp; R y llegué a la pequeña sección sobre variables de registro, y me preguntaba si las personas aquí tienen algunos buenos ejemplos de esto puesto en práctica.

De la sección 4.7 en K & amp; R:

  

La declaración de registro se parece a
       registrarse int x;
       registrarse char c;

Para ser claros, solo espero ver algunos ejemplos de código geniales. (Estoy bastante seguro de que entiendo) el tema, así que no siento la necesidad de escribir una explicación detallada (a menos que lo desee).

¿Fue útil?

Solución

No hay un buen ejemplo de uso de registros cuando se usan compiladores modernos (léase: últimos 15 años o más) porque casi nunca hace nada bueno y puede hacer algo malo. Cuando usas el registro, le estás diciendo al compilador "Sé cómo optimizar mi código mejor que tú". que casi nunca es el caso. Una de tres cosas puede suceder cuando usa el registro:

  • El compilador lo ignora, esto es muy probable. En este caso, el único daño es que no puede tomar la dirección de la variable en el código.
  • El compilador cumple con su solicitud y, como resultado, el código se ejecuta más lentamente.
  • El compilador cumple con su solicitud y el código se ejecuta más rápido, este es el escenario menos probable.

Incluso si un compilador produce un mejor código cuando usa el registro, no hay razón para creer que otro haga lo mismo. Si tiene algún código crítico que el compilador no está optimizando lo suficientemente bien, su mejor opción es probablemente usar el ensamblador para esa parte de todos modos, pero, por supuesto, hacer el perfil adecuado para verificar que el código generado es realmente un problema primero.

Otros consejos

En general, estoy de acuerdo con Robert , pero como buena regla, esta también tiene excepciones.
Si trabaja en un sistema profundamente integrado, puede saber mejor que el compilador cómo optimizar el código para su aplicación específica en su arquitectura de hardware específica .

Pero en el 99% de los casos, la explicación de Robert también es buena para la palabra incrustada.

Sé que esto es desde hace bastante tiempo, pero aquí hay una implementación de un subprocedimiento de heapsort en el que el uso de variables de registro hace que el algoritmo sea 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 algoritmo con y sin la palabra clave de registro antes de los atributos y lo ejecuté para ordenar una matriz aleatoria con 50,000,000 elementos en mi cuaderno, algunas veces para cada versión.

el uso de registros redujo el tiempo de almacenamiento dinámico de ~ 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 las 11 s pero cada ejecución redujo el tiempo hasta llegar a 9,65 s y se detuvo en ella

la versión con el registro comenzó a las 10s y bajó el tiempo hasta las 8,80s.

Creo que tiene algo que ver con la memoria caché. No obstante, parece que los registros hacen que el algoritmo sea más rápido por un factor constante

Dado que estas variables se usan bastante a lo largo del algoritmo, al garantizar que están en el registro en lugar de dejar este trabajo al compilador, se obtuvo un mejor resultado en este caso. Sin embargo, no mejoró tanto el tiempo.

Esperemos que esto sea útil para alguien, saludos.

scroll top