J'étais très intéressé par la mise à niveau vers Java 7 (pour mes propres raisons égoïstes de codage). Cependant, certains de nos utilisateurs sont très sensibles à la latence (tout doit être inférieur à la milliseconde). J'ai effectué un simple test de comparaison des performances entre 3 JVM différentes et j'ai constaté que Java 7 était beaucoup plus lent. Le test a poussé quelques messages simples à travers notre application. Il s'agit d'un test à faible charge et volume de charge, qui fait passer un seul message toutes les quelques secondes. Les résultats sont les suivants (en microsecondes) :
- Hotspot 6 (build 24): msgs= 23 avg= 902
- JRockit 6 (R28 b 29): msgs= 23 avg= 481
- Hotspot 7 (build 04): msgs= 34 avg=1130
La stratégie d'Oracle est de fusionner JRockit et Hotspot à partir de Java 7 (JRockit 6 est donc le dernier disponible). Quelqu'un a-t-il une idée de la raison pour laquelle les performances sont tellement moins bonnes ? (Il est à noter que le code a été compilé sous Java 1.6. Je ne sais pas si cela peut l'expliquer...)
MISE À JOUR : J'ai voté pour fermer ma propre question car je vois dans les commentaires que je ne suis pas vraiment en mesure de communiquer suffisamment d'informations pour en faire une question constructive. Merci à tous ceux qui ont commenté.
MISE À JOUR : Après avoir reçu plus de commentaires, j'ai pensé fournir plus d'informations. Le test est toujours après un nouveau départ. Tous les facteurs sont égaux pour chaque test. La seule chose qui change est la JVM . La répétition du test plusieurs fois donne un résultat cohérent. Aucun GC ne s'est produit dans aucune itération du test.
Le graphique ci-dessous présente les valeurs de l'un des tests effectués. Pour JRockit et Hotspot 7, la toute première valeur de latence a été rejetée. La première valeur de JRockit est énorme, mais elle s'optimise ensuite très rapidement et se stabilise vers la moyenne. Hotspot 7 prend plus de temps pour optimiser, et ne descend jamais vers une moyenne aussi basse que JRockit. Chaque point de données représente des microsecondes pour lire un message à partir d'un socket TCP/IP, exécuter la logique commerciale et écrire le message sur un autre socket. Chaque message est identique, et aucun nouveau chemin de code n'est entré pour aucun message.