Arrière-plan
La critique suivante de la boucle d'un morceau de numérique logiciel, écrit en C++, essentiellement compare deux objets par un de leurs membres:
for(int j=n;--j>0;)
asd[j%16]=a.e<b.e;
a
et b
sont de la classe ASD
:
struct ASD {
float e;
...
};
J'ai été d'étudier l'effet de mettre cette comparaison dans un léger fonction de membre:
bool test(const ASD& y)const {
return e<y.e;
}
et de l'utiliser comme ceci:
for(int j=n;--j>0;)
asd[j%16]=a.test(b);
Le compilateur est inline cette fonction, mais le problème, c'est que le code assembleur sera différente et la cause >10% de gestion d'exécution. J'ai à la question:
Questions
Pourquoi le compilateur prodrucing différentes assemblée de code?
Pourquoi est-ce le produit d'assemblage plus lent?
EDIT: La deuxième question a été répondu par la mise en œuvre de @KamyarSouri de la suggestion (j%16). L'assemblée actuellement, le code est presque identique (voir http://pastebin.com/diff.php?i=yqXedtPm). Les seules différences sont les lignes 18, 33, 48:
000646F9 movzx edx,dl
Matériel
- Le code de test: http://pastebin.com/03s3Kvry
- L'assemblée de sortie sur MSVC10 avec /Ox /Ob2 /Ot /arch:SSE2:
- Compilateur inline version: http://pastebin.com/yqXedtPm
- Manuellement inline version: http://pastebin.com/pYSXL77f
- Différence http://pastebin.com/diff.php?i=yqXedtPm
Ce graphique montre le FLOP/s (jusqu'à un facteur d'échelle) pour 50 lancement pour test de mon code.
Le script gnuplot pour générer le tracé: http://pastebin.com/8amNqya7
Options Du Compilateur:
/Zi /W3 /WX- /MP /Ox /Ob2 /Oi /Ot /Oy /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MT /GS /Gy /arch:SSE2 /fp:précis /Zc:wchar_t /Zc:forScope /Gd /analyser-
Options Du Linker: /INCRÉMENTAL:PAS de "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /ALLOWISOLATION /MANIFESTUAC:"niveau='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:FILE d'attente