Warum läuft mein Java-Programm 4 mal schneller über Eclipse als über Shell?

7

Wenn ich das folgende einfache Code-Beispiel über Eclipse (Version 3.5.2, unter Ubuntu 10.04, Java-Version "1.6.0_20") ausführe OpenJDK Laufzeitumgebung (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1 ~ 10.04.2) OpenJDK Server VM (Build 19.0-b09, gemischter Modus)), dauert es etwa 10 Sekunden. Wenn ich es von meiner Shell aus ausführe (mit derselben Priorität und Java-Version), dauert es etwa 40 Sekunden.

%Vor%

Ich habe auch andere Programme ausprobiert, die sich in der Laufzeit und der Menge der Ausgabe unterschieden: Jede war in der Shell viel langsamer. Dies war unabhängig von der Reihenfolge der Ausführung. Der minimale prozentuale Unterschied betrug 85 Sekunden in Eclipse gegenüber 145 Sekunden in der Shell für ein Programm mit sehr geringer Ausgabe.

Was ist der Grund?

    
DaveFar 26.08.2011, 14:22
quelle

4 Antworten

19

Es liegt daran, dass Sie Ihr Terminal terminieren. Einige Terminals sind beim Anzeigen / Scrollen von Text nur langsam. Und Ihr Terminal ist liniengepuffert, während die Eclipse-Konsole wahrscheinlich mehr Pufferung hat - was dazu führt, dass Ihr Programm nach jeder gedruckten Zeile auf Ihr Terminal warten muss.

Versuchen Sie, die Ausgabe Ihres Programms in eine Datei oder / dev / null umzuleiten, und geben Sie die Zeit ein.

Auf meinem System macht dies einen kleinen Unterschied zu Ihrer kleinen Schleife:

%Vor%     
nos 26.08.2011, 14:27
quelle
6

Da bei weitem die meiste Zeit für die Ausgabe Ihres Programms benötigt wird, hängt die Gesamtzeit für die Ausführung stark von der Zeit ab, die Ihr Systemaufruf dafür benötigt. Es scheint also viel langsamer als das Ausgabefenster in Eclipse, es auf die normale Konsole zu setzen, aber das bedeutet nicht, dass Ihr Programm selbst schneller ausgeführt wird.

Leite einfach alle Ausgaben in eine Datei und du wirst keinen großen Unterschied mehr sehen.

    
Alexander Rühl 26.08.2011 14:36
quelle
4

Zwei Möglichkeiten kommen mir in den Sinn. Erstens, in Eclipse ist die Java-Maschinerie bereits angezündet; vielleicht führt das Laufen von der Schale zu erheblichem Startaufwand. Probieren Sie nur die Schleife selbst aus (mit System.currentTimeMillis() ).

Zweitens ist Ihre Konfiguration möglicherweise so, dass Java, das von der Shell ausgeführt wird, JIT deaktiviert hat. Das könnte ein Programm erheblich verlangsamen. Überprüfen Sie Ihre Umgebungsvariablen auf alles, was den JIT-Compiler möglicherweise deaktiviert.

    
Ted Hopp 26.08.2011 14:26
quelle
2

Wie messen Sie die Zeit? Mit System.nanoTime() ? (Wenn Sie die Zeit extern messen, beachten Sie die Zeit, die zum Starten der VM benötigt wird).

Versuchen Sie Folgendes:

  • Ändern Sie Ihre Hauptmethode, um zuerst einen Aufwärmlauf ohne Aufnahmezeiten durchzuführen.
  • Dann messen Sie die Zeit für mehrere andere Lauf mit System.nanoTime() .
  • Sehen Sie, ob es einen signifikanten Leistungsunterschied zwischen der gemittelten Zeit gibt, die von der Konsole und Eclipse gemessen wurde.
Anthony Accioly 26.08.2011 14:31
quelle