124 votes

Dois j’utiliser multiplication ou division ?

Voici un drôle de plaisir question:

Disons que nous avons à effectuer une simple opération que nous avons besoin de la moitié de la valeur d'une variable. Il y a généralement deux façons de le faire:

y = x / 2.0;
// or...
y = x * 0.5;

En supposant que nous soyons en utilisant les opérateurs standard fourni avec la langue, dont on a de meilleures performances?

Je devine que la multiplication est généralement mieux donc j'essaie de coller à ce que j'ai le code, mais je tiens à le confirmer.

Bien que personnellement, je suis intéressé par la réponse pour Python 2.4-2.5, n'hésitez pas à poster également une réponse pour les autres langues! Et si vous le souhaitez, n'hésitez pas à poster d'autres amateur de moyens (comme l'utilisation d'opérateurs de décalage de bit-à-bit).

81voto

Javier Points 33134

Python :

la multiplication est 33 % plus rapide

Lua :

= > pas de réelle différence

LuaJIT :

= > C’est seulement 5 % plus rapide

Conclusions : en Python, il est plus rapide de multiplier qu’afin de diviser, mais que l'on se rapproche de la CPU en utilisant les plus avancés VMs ou ECE, l’avantage disparaît. Il est fort possible qu’un futur VM Python rendrait non pertinentes

70voto

Bill K Points 32115

Utilisez toujours ce qui est le plus clair. Autre chose que vous faites est d'essayer de déjouer le compilateur. Si le compilateur est en tout intelligent, il fera de son mieux pour optimiser le résultat, mais rien ne peut faire le gars à côté, pas vous déteste pour votre merde bitshifting solution (j'aime manipulation de bits par ailleurs, il est amusant. Mais le plaisir != lisible)

L'optimisation prématurée est la racine de tous les maux. Toujours n'oubliez pas les trois règles de l'optimisation!

  1. Ne pas optimiser.
  2. Si vous êtes un expert, voir la règle n ° 1
  3. Si vous êtes un expert et peut justifier le besoin, utilisez la procédure suivante:

    • Le Code qu'il unoptimized
    • déterminer la vitesse est "assez Rapide"--Note les exigences de l'utilisateur/histoire exige que la métrique.
    • Écrire un test de vitesse
    • Test de code existant, Si elle est suffisamment rapide, vous avez terminé.
    • Recode il optimisé
    • Test de code optimisé. SI il ne répond pas à la métrique, de la jeter et garder l'original.
    • Si elle satisfait à l'essai, de conserver l'original du code dans les commentaires

Aussi, en faisant des choses comme la suppression des boucles internes quand ils ne sont pas nécessaires ou choisir une liste, un tableau pour un d'insertion de tri ne sont pas des optimisations, juste de la programmation.

49voto

Thomas Owens Points 45042

Je pense que c'est trop tâtillon qui vous serait mieux de faire tout ce qui le rend le code plus lisible. Sauf si vous effectuez les opérations de milliers, sinon des millions, des fois, je doute que quelqu'un va remarquer la différence.

Si vous avez vraiment à faire le choix, le benchmarking est la seule façon d'aller. Trouver quelle fonction(s) sont en vous donnant des problèmes, puis de trouver où dans la fonction les problèmes se produisent, et de corriger ces sections. Cependant, je doute qu'une simple opération mathématique (même répété à de nombreuses reprises) pourrait bien être la cause de tout goulot d'étranglement.

39voto

Mark Ransom Points 132545

La multiplication est plus rapide, la division est plus précise. Si votre numéro n’est pas une puissance de 2, vous perdrez quelques précision :

La question de la vitesse n’est susceptible à la matière dans les langages C/C++ ou JIT et même dans ce cas uniquement si l’opération est dans une boucle à un goulot d’étranglement.

25voto

Jason S Points 58434

Si vous souhaitez optimiser votre code, mais toujours être clair, essayez ceci :

Le compilateur doit être capable de faire la fracture au moment de la compilation, afin que vous obteniez un se multiplient au moment de l’exécution. Je m’attends la précision à être les mêmes que dans le `` cas.

Là où cela peut être important beaucoup est dans les processeurs embarqués où émulation en virgule flottante est nécessaire pour calculer l’arithmétique à virgule flottante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X