7
votes

Pourquoi mon programme Java fonctionne-t-il 4 fois plus vite via Eclipse que via Shell?

Lorsque j'exécute l'exemple de code simple ci-dessous via Eclipse (version 3.5.2, sur Ubuntu 10.04, java version "1.6.0_20" Environnement d'exécution OpenJDK (ICEDTEA6 1.9.9) (6B20-1.9.9-0ubuntu1 ~ 10.04.2) OpenJDK Server VM (version 19.0-B09, mode mixte)), il faut environ 10 secondes. Lorsque je l'exécute de mon shell (en utilisant la même version prioritaire et Java), il faut environ 40 secondes.

for (int i = 0; i<1000*1000; i++) {
  System.out.println(Math.cos(i));
}


5 commentaires

Je suppose que Eclipse utilise une JVM déjà en cours d'exécution, alors que lorsque vous exécutez Java manuellement, il doit en commencer un.


Êtes-vous sûr que la JDK votre console appelle est OpenJDK Server VM (version 19.0-B09, mode mixte)? Essayez d'exécuter la version shell avec Eclipse Ouvrir et d'exécuter un test de ralenti pour voir si le fait qu'il y a déjà un JVM déjà lancé a un impact sur ce comportement comme @jeremy Heiler suggère judicieusement.


Serait-ce que la lenteur est d'imprimer sur la console, surtout si vous utilisez un bureau de composition comme Gnome 3 ou l'unité? Essayez de rediriger la sortie dans un fichier et testez vos deux.


S'il vous plaît voir Stackoverflow.com/questions/7124489/... pour un problème très similaire et une réponse possible.


Hah @hircus, un comportement, de nombreuses possibilités;)


4 Réponses :


4
votes

Deux possibilités viennent à l'esprit. Premièrement, dans Eclipse, les machines Java sont déjà tirées; Peut-être que la coque entraîne une surcharge de démarrage significative. Essayez de synchroniser juste la boucle elle-même (en utilisant system.currenttimemillis () ).

Deuxièmement, votre configuration est peut-être telle que Java s'exécutant de la coquille a JIT désactivé. Cela pourrait ralentir de manière significative un programme. Vérifiez vos variables d'environnement pour tout ce qui pourrait désactiver le compilateur JIT.


4 commentaires

J'ai également fait des échantillons avec une micro-référence (bibliothèque de mesures d'exécution), et elle a montré le même ralentissement.


Je ne trouve rien de pertinent dans mon environnement Shell. Pourrait-il y avoir une certaine configuration cachée ailleurs? HM, je vais simplement vérifier si mon programme Java s'exécute encore plus lentement lorsque je désactive JIT via une option ...


JIT était actif, la console d'Eclipse est tout simplement beaucoup plus rapide que celle de la coquille (+5 à nos Nos et Geziefer).


Oui, je vois que Nos et Geziefer l'ont compris. Bien fait pour eux!



20
votes

C'est parce que vous chronométrez votre terminal. Certaines terminaux ne sont que des tourbières lentes lors de l'affichage / du texte défilant. Et votre terminal est en mémoire tampon en ligne, vs La console Eclipse a probablement plus de mise en mémoire tampon - menant à votre programme devant attendre votre terminal après chaque ligne qu'elle imprime.

Essayez de rediriger la sortie de votre programme vers un fichier ou / dev / null. et le temps dessus.

sur mon système, cela fait une différence un peu avec votre petite boucle: xxx


1 commentaires

Wow, mon terminal est lent de bugs. J'ai suspecté la sortie et l'a donc réduit dans mes expériences, mais je ne l'ai pas complètement évité (de sorte qu'aucune élimination du code mort ne se produise). Je ne croyais pas qu'une production de temps en temps pourrait avoir un impact aussi énorme, donc je n'ai pas étudié plus. Après avoir redirecté de la sortie: pas plus de différence de temps.



2
votes

Comment allez-vous le temps de mesure? En utilisant system.nanotime () ? (Si vous mesurez du temps à l'extérieur, gardez à l'esprit le temps de bootstrap le VM).

Essayez de faire ce qui suit:

  • Modifiez votre méthode principale pour effectuer une réchauffement d'abord sans l'enregistrement.
  • Mesurez ensuite le temps pour plusieurs autres exécutions à l'aide de System.NanOTIME () .
  • Voir s'il existe une différence de performance significative entre le temps moyen mesuré à partir de la console et de l'éclipse.

1 commentaires

+5 pour votre dernière suggestion. N'aurait pas deviné que la coquille peut être tellement plus lente que la console d'Eclipse: -0



6
votes

Depuis bien le plus de temps, votre programme consacre à faire de la production, le temps d'exécution total est très en fonction du temps que votre appel système prend pour cela. Alors, le mettre sur la console régulière semble être beaucoup plus lent que la fenêtre de sortie de Eclipse, mais cela ne signifie pas que votre programme lui-même est exécuté plus rapidement.

Dirigez simplement toute la sortie dans un fichier et vous ne verrez plus beaucoup de différence.


0 commentaires