Laisse-nous savoir ce que fait réellement un vrai compilateur avec ce code? J'aime MINGW GCC 4.3 (x86). Je "test.c gcc -c -O2 -S -Wall"
Cette fonction:.
float calc_mean(unsigned char r, unsigned char g, unsigned char b)
{
return (r+b+g)/3/255.0f;
}
génère ce code objet (entrée de la fonction et le code de sortie pour plus de clarté j'espère que les commentaires que j'ai ajouté sont à peu près correct):
movzbl 12(%ebp), %edx ; edx = g
movzbl 8(%ebp), %eax ; eax = r
addl %eax, %edx ; edx = eax + edx
movzbl 16(%ebp), %eax ; eax = b
addl %eax, %edx ; edx = eax + edx
movl $1431655766, %eax ;
imull %edx ; edx *= a const
flds LC0 ; put a const in the floating point reg
pushl %edx ; put edx on the stack
fidivrl (%esp) ; float reg /= top of stack
considérant que cette fonction:
float calc_mean2(unsigned char r, unsigned char g, unsigned char b)
{
const float AVERAGE_SCALE_FACTOR = 1.f/(3.f * 255.f);
return (r+b+g) * AVERAGE_SCALE_FACTOR;
}
génère ceci:
movzbl 12(%ebp), %eax
movzbl 8(%ebp), %edx
addl %edx, %eax
movzbl 16(%ebp), %edx
addl %edx, %eax
flds LC2
pushl %eax
fimull (%esp)
Comme vous pouvez le voir, la deuxième fonction est meilleure. Compiler avec -freciprocal-math convertit le fidivrl de la première fonction en un fimull, ce qui devrait être une amélioration. Mais la deuxième fonction est encore meilleure. Cependant, si vous considérez qu'une CPU de bureau moderne a quelque chose comme un pipeline à 18 étages et qu'elle est capable d'exécuter plusieurs de ces instructions par cycle, vous pouvez voir que la performance de ces fonctions sera dominée par des stalles dues aux dépendances de données. J'espère que votre programme a cet extrait de code en ligne et avec un peu de déroulement de la boucle. Considérer qu'un si petit fragment de code isolé n'est pas idéal. C'est un peu comme conduire une voiture avec des jumelles collées aux orbites. Zoom sur l'homme!
+1 pour une solution qui conduira probablement à une accélération et peut être implémentée avec élégance. Cependant, il vaut la peine de mesurer pour s'assurer que c'est vraiment plus rapide. – sharptooth
bonne accélération merci, dommage que je ne peux pas utiliser l'astuce de décalage serait encore plus rapide je soupçonne :( – ldog
Si votre compilateur est l'optimisation du tout, la multiplication devrait être bien.Le truc de décalage ne fonctionnera probablement pas pour les flotteurs. –