2010-11-01 35 views
23

Doublons possibles:
Is shifting bits faster than multiplying and dividing in Java? .NET?
Quick Java Optimization QuestionDois-je changer de bit pour diviser par 2 en Java?

Il y a plusieurs années à l'université, j'ai appris que peu-décalage vers la droite par une accomplit la même chose que la division par deux, mais il est généralement significativement plus rapide. Je ne suis pas sûr de la façon dont Java est venu à cet égard depuis les 9-10 ans, j'ai appris à ce sujet. Est-ce que le compilateur Java convertit automatiquement une division par deux en une opération de décalage de bits, ou dois-je effectuer manuellement l'opération de décalage de bits dans le code moi-même?

+1

http://stackoverflow.com/questions/1514949/quick-java-optimization-question Il adresse la multiplication par deux, mais les réponses sont applicables. –

+1

En général, si l'opération A accomplit * exactement * la même chose que l'opération B et le fait plus vite, quelque part le long de la ligne B sera probablement optimisé en A. Le problème est quand il y a des différences de casiers. être optimisé dans l'autre. Dans ces cas, vous devez 1) évaluer si la différence de performance compte réellement (pas d'optimisation prématurée!), 2) tenir compte des cas frontaliers (programme autour d'eux ou prouver qu'ils ne seront pas touchés, et 3) déterminer si les gains existent et justifier la diminution de la lisibilité. –

+7

Je suis profondément attristé par l'éventail des réponses à cette question. Premièrement, la division par deux et le déplacement à droite ne donneront pas le même résultat pour les nombres négatifs dans tous les cas. Deuxièmement, lorsque le résultat décalé est suffisant, il est environ 10 à 20 fois plus rapide que la division. Troisièmement, le compilateur n'optimisera pas cela parce que dans n'importe quel cas non trivial il sera incapable de prouver que l'opérande décalé n'est pas négatif. Oh et les réponses de la question de multiplication ne couvrent pas la division, car la situation avec les optimiseurs est différente xD – Durandal

Répondre

52

Sauf si vous travaillez dans un magasin et une base de code où le transfert de bits est commun alors, à mon humble avis, vous risquez d'obfuscation. Oui, les expressions peuvent être logiquement équivalentes, mais:

  • Un n00b peut se confondre par la syntaxe alternative
  • Un vieil homme qui n'a pas eu à faire tout décalage de bits depuis le collège, comme moi, peut obtenir confus
  • Si vous avez un peu de décalage et ressentez le besoin de commenter ce que vous venez de faire, alors vous êtes définitivement éteint. La division simple est auto-documentée et serait claire pour quiconque connaît les mathématiques élémentaires
  • Vous n'allez pas trop malmener un compilateur pour l'optimisation sur quelque chose d'aussi simple, alors ne vous embêtez pas à essayer
  • Comme bonne pratique de codage c'est mieux pour faire votre code simple/vanille plutôt que malin (er)

Tout cela est relatif et, encore une fois, dépend vraiment des normes de votre boutique. Si vos collègues aiment se décaler, alors allez-y et changez de position.

+29

Son dans l'oeil du spectateur. Pourquoi 'x * 2' est-il moins obfusqué que' x << 1'? Est-ce que 'x << 1' ne signifie pas clairement' x * 2'? C'est comme dire hey «x + 1» est plus clair que «1 + x». – Pacerier

+7

De nombreux programmeurs, en particulier les développeurs débutants, ne sont pas familiers avec les bitshifts, ou ne reconnaîtront pas immédiatement l'intention. C'est essentiellement un argument d'utilisabilité pour les programmeurs qui peuvent travailler sur le code après vous. – cacois

+0

Vous pouvez toujours commenter le code; et pourquoi assumer le contexte dans lequel cela est envisagé quand aucun n'est donné? – Chris2048

10

La routine de division pour votre CPU va gérer cela. Vous n'avez pas besoin de le faire.

Ceci est connu comme optimisation prématurée.

+14

Optimisation précoce! = Optimisation prématurée. Oui * la plupart du temps, quand quelqu'un veut commencer à faire des petits tours, c'est probablement un exemple d'optimisation prématurée, mais ce n'est pas toujours le cas. J'ai personnellement vu des cas où j'ai obtenu des résultats sensiblement meilleurs car j'avais des informations que le compilateur n'avait pas. Je déteste que tout le monde commence toujours à crier "optimisation prématurée !!!" n'importe quand quelque chose comme ceci est soulevé. –

+0

Je suis d'accord avec cela, mais dans l'ensemble ce serait une optimisation prématurée. Et souvent, les optimisations ne consistent pas à trouver quelque chose qui est légèrement plus rapide et à l'utiliser à la place, mais plutôt à trouver une nouvelle façon de résoudre un problème qui demande moins de travail. – Malfist

+3

La routine de la division de votre CPU est en fait une instruction, et elle sera toujours environ 20 fois plus lente qu'un décalage de bits. Le 'compilateur' peut remplacer une division par un changement, mais c'est tout. –

17

Les compilateurs modernes sont assez intelligents pour générer le code le plus rapide pour les divisions par deux. Ils vont faire un changement si c'est plus rapide. Si ce que vous voulez réaliser est une division par 2, l'utilisation d'une division rendra votre code plus clair. Et vous éviterez des problèmes lorsque le nombre à diviser est négatif.

+0

Évitez les problèmes ou les causes? J'ai vu beaucoup plus d'applications où le maintien de l'axiome '(n + d)/d == (n/d) + 1' était important que lorsque' (-n)/d == - (n = d) 'avait n'importe quelle valeur. – supercat

11

Oui, c'est la toute première chose que toute personne qui tente de faire des optimisations de compilateur fera (et fait depuis au moins 5 décennies), c'est certainement fait par le compilateur Java JIT, et vous auriez probablement très difficile de trouver un compilateur qui ne le fait pas. Et même si ce n'était pas le cas, ce serait encore une micro-optimisation prématurée qui devrait être évitée en faveur d'un code plus clair.

+0

cela devrait être la réponse, au lieu de répondre réellement à la question si java le fait ou non, les gens dansent autour si sa bonne pratique ou pas ... – vach