Question d’optimisation rapide Java

Le compilateur Eclipse convertira-t-il automatiquement la multiplication par une puissance de deux en un décalage de bit, ou devrais-je le faire manuellement? Merci pour l’aide.

Réponse courte: Non. Le compilateur de code source ne remplacera pas une multiplication par deux avec un décalage de bit.

Réponse longue: Ce ne sera pas le cas, car il ne peut pas savoir si un décalage est plus rapide qu’une multiplication sur la plate-forme, le code sera éventuellement exécuté. La question devrait donc plutôt être de savoir si une machine virtuelle spécifique remplacera la multiplication par un décalage, et ce sera probablement le cas. J’ai un peu expérimenté cela pour optimiser un bloc de code et il est intéressant de noter que Hotspot de Sun affiche un comportement différent ici, selon que le programme fonctionne sur un processeur AMD ou sur un processeur Intel (au moins avec les processeurs que j’ai testés). Dans les deux cas, une multiplication avec une puissance de deux est remplacée par un décalage de bit, mais pour les multiplications avec une puissance de deux +/- 1 (3, 5, 7, 9, 15, 17, …), Hotspot générer un décalage de bit et une addition ou une soustraction pour les processeurs Intel, tout en générant une multiplication pour les processeurs AMD, car le processeur AMD exécute une multiplication beaucoup plus rapidement que le processeur Intel. Il est bien entendu possible que ce comportement diffère entre les différents modèles de CPU de chaque fournisseur.

Si vous souhaitez savoir ce que fait la machine virtuelle, il est très utile d’obtenir la version de débogage de jdk7 et d’autoriser le vidage du code assembleur généré par le compilateur Hotspot.

N’essayez pas de deviner un compilateur Java moderne à moins de savoir exactement ce que vous faites. Ceci s’applique non seulement aux mathématiques simples comme celle que vous posez, mais à tout. Ex: comme le contrôle de stream.

Les gens plus intelligents que nous ont mis beaucoup d’efforts pour rendre tout cela super rapide.

En général, vous ne pouvez pas déjouer la JVM à moins que vous sachiez quelque chose de très haut niveau que vous ne pouvez pas déduire automatiquement. Cela signifie généralement qu’un meilleur algorithme est disponible que celui qui est actuellement utilisé au lieu d’avoir à maintes resockets votre source. Vous pouvez utiliser le profileur jvisualvm disponible dans les derniers JDK Java 6 pour étudier votre programme et voir où se trouvent les goulots d’étranglement.

Par exemple, les dépenses liées à la création de nouveaux objects au lieu de réutiliser les anciens ont radicalement diminué par rapport aux 10 dernières années. Vous ne devez donc pas suivre les vieux conseils pour ajuster votre programme java sans vérifier s’il est toujours valable.

Cependant, vous constaterez que le fait de garder votre programme simple et surtout – lisible – facilitera grandement la maintenance, à la fois pour vous et pour les futurs programmeurs. Toute complexité inutile nécessitera de confondre vos futurs lecteurs, et vous aurez besoin de dire dans un commentaire pourquoi cela DOIT être ainsi (sinon, ils devront simplement le reformuler dans sa forme originale 🙂