43 votes

Conseils d'optimisation Java obsolètes

Il existe un certain nombre de conseils pour améliorer les performances rendues obsolètes par le compilateur Java et en particulier le Profil de l'optimisation orientée. Par exemple, la plate-forme fournie optimisations peuvent considérablement (selon les sources) réduit le coût de la fonction virtuelle appels. VM est aussi capable de la méthode de l'in-lining, déroulement de la boucle etc.

Quelles sont les autres l'optimisation des performances techniques que vous est venu autour, toujours appliquée, mais sont en fait rendu obsolète par l'optimisation des mécanismes trouvé dans le plus moderne de la Jvm?

24voto

Eugene Kuleshov Points 17757

Le dernier modificateur des méthodes et des paramètres de méthode n’aide en rien la performance.

En outre, le wiki Java HotSpot donne une bonne vue d'ensemble des optimisations utilisées par HotSpot et explique comment les utiliser efficacement dans du code Java.

21voto

Paul Tomblin Points 83687

Personnes remplaçant String a = "this" + var1 + " is " + var2; par plusieurs appels à StringBuilder ou StringBuffer. En fait, il utilise déjà StringBuilder en coulisse.

17voto

khachik Points 12589

Il est nécessaire de définir le temps de la mémoire et du compromis avant de commencer l'optimisation de la performance. C'est la façon dont je le fais pour mon mémoire/temps d'application critique (à répéter quelques réponses ci-dessus, pour être complet):

  1. Règle n ° 1: ne Jamais faire de l'optimisation de la performance sur le stade de développement antérieur. Ne jamais le faire si vos n'en avez pas besoin vraiment. S'il décide de le faire, alors:
  2. l'utilisation de profils pour trouver les goulots d'étranglement, d'examiner le code source pour trouver les raisons pour les goulets d'étranglement;
  3. choisir la bonne structure de données avec le meilleur ajustement dans le temps défini/mémoire compromis;
  4. choisir des algorithmes appropriés (par exemple, l'itération vs la récursivité, etc);
  5. évitez d'utiliser des objets synchronisés à partir de java bibliothèque, si vous n'en avez pas besoin vraiment;
  6. éviter explicitement/implicitement la création de nouveaux objets;
  7. override/re-mettre en œuvre des types de données/algorithmes de venir avec java si et seulement si vous êtes sûr qu'ils ne sont pas adaptées à vos exigences.
  8. Utilisez des petits, des tests indépendants pour tester les performances de choisi algos/structures de données.

8voto

Will Points 30630

En 2001, j'ai fait des applications pour un J2ME téléphone. Il était de la taille d'une brique. Et très près de la puissance de calcul d'une brique.

Faire de Java apps de fonctionner de façon acceptable sur il doit écrire en tant que procédure que possible de la mode. En outre, la très grande amélioration de la performance est d'attraper l' ArrayIndexOutOfBoundsException à la sortie pour des boucles sur l'ensemble des éléments dans un vecteur. Penser à cela!

Même sur Android il y a des 'fast' boucle sur tous les éléments dans un tableau et "lent" façons d'écrire la même chose, comme mentionné dans le Google IO vidéos sur dalvik VM internes.

Toutefois, en réponse à votre question, je dirais qu'il est plus rare d'avoir à micro-optimiser ce genre de chose ces jours-ci, et je voudrais en outre s'attendre à ce que JIT VM (même le nouveau Android 2.2 VM, ce qui ajoute JIT) ces optimisations sont discutable. En 2001, le téléphone s'KVM interprète à 33MHz. Maintenant, il fonctionne dalvik - une plus grande vitesse de VM que KVM - à 500MHz à 1500MHz, avec un beaucoup plus rapide d'architecture ARM (meilleur processeur, même si la vitesse d'horloge de gains) avec L1 e.t.c. et JIT arrive.

Nous ne sommes pas encore dans les domaines où je serais à l'aise de faire directement la manipulation de pixels en Java sur téléphone ou sur le bureau avec un core i7 - il y a donc tout à fait normal de tous les jours code Java n'est pas assez rapide pour. Voici un blog intéressant qui prétend qu'un expert a dit que Java est de 80% de C++ vitesse pour certains gros CPU tâche; je suis sceptique, j'écris de manipulation de l'image de code et je vois un ordre de grandeur entre Java et natif pour des boucles plus de pixels. Peut-être que je suis en manque quelques truc...? :D

4voto

Michael Shopsin Points 830
  1. N'appelez pas manuellement le ramasse-miettes, cela nuirait aux performances des implémentations JVM modernes.
  2. Entier au lieu de Long ne vous fera pas économiser beaucoup d’espace, mais limitera la plage des nombres.
  3. Évitez les classes Enum générées à la main et utilisez plutôt l’énumération intégrée. Java 1.5 a introduit de véritables Enums, utilisez-les.

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