Je vais juste ajouter quelque chose pour l'option "autres langues".
C: Comme il ne s'agit que d'un exercice académique qui ne fait vraiment aucune différence, j'ai pensé que j'apporterais quelque chose de différent.
J'ai compilé en assemblage sans optimisations et j'ai regardé le résultat.
Le code:
int main() {
volatile int a;
volatile int b;
asm("## 5/2\n");
a = 5;
a = a / 2;
asm("## 5*0.5");
b = 5;
b = b * 0.5;
asm("## done");
return a + b;
}
compilé avec gcc tdiv.c -O1 -o tdiv.s -S
la division par 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
et la multiplication par 0,5:
movl $5, -8(%ebp)
movl -8(%ebp), %eax
pushl %eax
fildl (%esp)
leal 4(%esp), %esp
fmuls LC0
fnstcw -10(%ebp)
movzwl -10(%ebp), %eax
orw $3072, %ax
movw %ax, -12(%ebp)
fldcw -12(%ebp)
fistpl -16(%ebp)
fldcw -10(%ebp)
movl -16(%ebp), %eax
movl %eax, -8(%ebp)
Cependant, lorsque j'ai changé ces int
s en double
s (ce que ferait probablement python), j'ai obtenu ceci:
division:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
multiplication:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Je n'ai évalué aucun de ce code, mais juste en examinant le code, vous pouvez voir qu'en utilisant des entiers, la division par 2 est plus courte que la multiplication par 2. En utilisant des doubles, la multiplication est plus courte car le compilateur utilise les opcodes en virgule flottante du processeur, qui probablement courir plus vite (mais en fait je ne sais pas) que de ne pas les utiliser pour la même opération. Donc en fin de compte, cette réponse a montré que la performance de la multiplication par 0,5 vs la division par 2 dépend de l'implémentation du langage et de la plateforme sur laquelle il fonctionne. Au final, la différence est négligeable et vous ne devriez pratiquement jamais vous inquiéter, sauf en termes de lisibilité.
En remarque, vous pouvez voir que dans mon programme main()
renvoiea + b
. Lorsque j'enlève le mot-clé volatile, vous ne devinerez jamais à quoi ressemble l'assemblage (à l'exclusion de la configuration du programme):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
il a fait à la fois la division, la multiplication ET l'addition en une seule instruction! De toute évidence, vous n'avez pas à vous en soucier si l'optimiseur est respectable.
Désolé pour la réponse trop longue.