Aquí hay dos maneras de configurar un bit individual en C en x86-64:Eficacia de optmization GCC en operaciones de bits
inline void SetBitC(long *array, int bit) {
//Pure C version
*array |= 1<<bit;
}
inline void SetBitASM(long *array, int bit) {
// Using inline x86 assembly
asm("bts %1,%0" : "+r" (*array) : "g" (bit));
}
con gcc 4.3 con -O3 -march=core2
opciones, la versión C tarda aproximadamente 90% más de tiempo cuando se usa con una constante bit
. (Ambas versiones compilan a exactamente el mismo código de montaje, excepto que la versión C utiliza una instrucción or [1<<num],%rax
en vez de una instrucción de bts [num],%rax
)
Cuando se utiliza con una variable bit
, la versión C realiza mejor, pero es aún significativamente más lento que el inline montaje.
Restablecer, alternar y comprobar bits tienen resultados similares.
¿Por qué GCC se optimiza tan poco para una operación tan común? ¿Estoy haciendo algo mal con la versión C?
Edit: Disculpe por la larga espera, aquí está el código que solía comparar. En realidad comenzó como un simple problema de programación ...
int main() {
// Get the sum of all integers from 1 to 2^28 with bit 11 always set
unsigned long i,j,c=0;
for (i=1; i<(1<<28); i++) {
j = i;
SetBit(&j, 10);
c += j;
}
printf("Result: %lu\n", c);
return 0;
}
gcc -O3 -march=core2 -pg test.c
./a.out
gprof
with ASM: 101.12 0.08 0.08 main
with C: 101.12 0.16 0.16 main
time ./a.out
también da resultados similares.
¿Es realmente una "operación común"? El momento más común en que veo que se usa la manipulación de bits es en la optimización prematura por parte de personas que piensan que ahorrarán memoria al agrupar un grupo de indicadores en un solo byte. –
Hmm ... buen punto. Aún así, es una operación bastante simple y común en los controladores de hardware. De todos modos, el punto es la disminución del 90% del rendimiento. –
En la programación del controlador, estoy bastante seguro de que el modismo "giro a la izquierda 1 para determinar nuestra máscara" no se usa demasiado. En su lugar, 'o' con un indicador predefinido. –