Si está escribiendo código para una PC, es poco probable que haya una ventaja de velocidad significativa en ambos sentidos. En algunos sistemas integrados, puede ser ventajoso evitar todas las variables locales. En algunos otros sistemas, las variables locales pueden ser más rápidas.
Un ejemplo de lo anterior: en el Z80, el código para configurar el marco de pila para una función con cualquier variable local era bastante largo. Además, el código para acceder a las variables locales se limitaba a utilizar el modo de direccionamiento (IX + d), que solo estaba disponible para las instrucciones de 8 bits. Si X e Y eran ambos ambas variables locales global/estática o, la afirmación "X = Y" podría montar ya sea como:
; If both are static or global: 6 bytes; 32 cycles
ld HL,(_Y) ; 16 cycles
ld (_X),HL ; 16 cycles
; If both are local: 12 bytes; 56 cycles
ld E,(IX+_Y) ; 14 cycles
ld D,(IX+_Y+1) ; 14 cycles
ld (IX+_X),D ; 14 cycles
ld (IX+_X+1),E ; 14 cycles
Una pena de espacio de código 100% y 75% penalización de tiempo además del código y hora de configurar el marco de pila!
En el procesador ARM, una sola instrucción puede cargar una variable que se encuentra dentro de +/- 2K de un puntero de dirección. Si las variables locales de una función suman 2K o menos, se puede acceder a ellas con una sola instrucción. Las variables globales generalmente requerirán dos o más instrucciones para cargar, dependiendo de dónde estén almacenadas.
+1 por sugerir una herramienta de referencia. Usar un generador de perfiles siempre debe ser el primer paso para verificar si algo 'más rápido' o 'más lento' – linuxuser27
Ya sé por el perfil que no importaba en mi aplicación específica, pero me dio curiosidad si alguna vez lo sería. Y ahora veo por qué no debería. –