Estilo de codificación C y C++ para conseguir el mejor rendimiento

En muchos casos, el costo de rendimiento de una construcción C no es obvio, y a veces es incluso contrario a lo que se podría intuir.

Algunas de estas situaciones son las siguientes:

  • Siempre que sea posible, utilice int en lugar de char o short.

    En la mayoría de los casos, los elementos de datos char y short toman más instrucciones para manipular. Las instrucciones adicionales cuestan tiempo y, excepto en las matrices grandes, cualquier espacio que se guarde utilizando los tipos de datos más pequeños está más que compensado por el aumento del tamaño del programa ejecutable.

  • Si tiene que utilizar un char, que sea unsigned, si es posible.

    Un signed char toma otras dos instrucciones más que un unsigned char cada vez que la variable se carga en un registro.

  • Utilice variables locales (automáticas) en lugar de variables globales siempre que sea posible.

    Las variables globales requieren más instrucciones de acceso que las variables locales. Además, en ausencia de información en sentido contrario, el compilador asume que cualquier variable global puede haber sido cambiada por una llamada de subrutina. Este cambio tiene un efecto adverso en la optimización porque el valor de cualquier variable global utilizada después de una llamada de subrutina tendrá que volver a cargarse.

  • Cuando es necesario acceder a una variable global (que no se comparte con otras hebras), copie el valor en una variable local y utilice la copia.

    A menos que se acceda a la variable global solo una vez, es más eficaz utilizar la copia local.

  • Utilice códigos binarios en lugar de series para registrar y probar situaciones. Las series consumen tanto espacio de datos como de instrucción. Por ejemplo, la secuencia:
    #define situation_1 1
    #define situation_2 2
    #define situation_3 3
    int situation_val;
    
    situation_val = situation_2;
    . . .
    if (situation_val == situation_1)
    . . .

    es mucho más eficiente que la secuencia siguiente:

    char situation_val[20];
    
    strcpy(situation_val,"situation_2");
    . . .
    if ((strcmp(situation_val,"situation_1"))==0)
    . . .
  • Cuando las series son necesarias, utilice series de longitud fija en lugar de series de longitud variable terminadas en nulo siempre que sea posible.

    La familia de rutinas mem*(), como memcpy(), es más rápida que las rutinas str*() correspondientes, como strcpy(), porque las rutinas str*() deben comprobar cada byte para ver si es null y las rutinas mem*() no.