currentTimeMillis() < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 07:33 Di 03.05.2011 | Autor: | Physy |
Ich würde gerne die Laufzeit meines Java-Programms mit currentTimeMillis() messen:
long zeit=System.currentTimeMillis();
System.out.println("Die "+n+". Fibonacci-Zahl lautet "+fibonacciIterativ(n)+". (iterativ)");
System.out.println("Benoetigte Zeit: "+(System.currentTimeMillis()-zeit));
Mein Problem ist, dass ich jedesmal eine Zeitdifferenz von 0 erhalte, selbst wenn ich die 45. Fibonacci-Zahl berechenen lasse. Woran liegt das?
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 07:55 Di 03.05.2011 | Autor: | felixf |
Moin!
> Ich würde gerne die Laufzeit meines Java-Programms mit
> currentTimeMillis() messen:
>
> long zeit=System.currentTimeMillis();
> System.out.println("Die "+n+". Fibonacci-Zahl lautet
> "+fibonacciIterativ(n)+". (iterativ)");
> System.out.println("Benoetigte Zeit:
> "+(System.currentTimeMillis()-zeit));
>
> Mein Problem ist, dass ich jedesmal eine Zeitdifferenz von
> 0 erhalte, selbst wenn ich die 45. Fibonacci-Zahl
> berechenen lasse. Woran liegt das?
Das "Problem" ist: dein Programm ist zu schnell
Deswegen fuehrt man sowas meist mehrere tausend mal aus, bis man eine aussagekraeftige Zahl bekommt; etwa so:
1: | int anzahl = 100000;
| 2: | long zeit=System.currentTimeMillis();
| 3: | for (int i = 0; i < anzahl; ++i)
| 4: | fibonacciIterativ(n);
| 5: | System.out.println("Benoetigte Zeit: "+((double)((System.currentTimeMillis()-zeit) / (double)anzahl));
|
Den Wert von "anzahl" kannst du natuerlich anpassen; das Ergebnis von System.currentTimeMillis()-zeit sollte einfach gross genug sein, damit das Ergebnis genau genug ist.
LG Felix
PS: Solche Timing-Analysen sind nur sehr begrenzt wertvoll. Vor allem solltest du dafuer sorgen, dass so wenig Programme wie moeglich im Hintergrund laufen, optimal waer wenn der Java-Prozess die ganze Zeit seine eigene CPU/seinen eigenen Core hat. (Hyperthreading zaehlt da nicht.)
|
|
|
|
|
Hallo!
Noch ein Kommentar:
Heutige CPUs takten sich runter, wenn nichts zu tun ist, und takten sich mit einer kurzen Verzögerung wieder hoch, wenns Arbeit gibt.
Es wäre ziemlich doof, wenn dieses Hochtakten während deiner Messung geschieht, weil du dann vermutlich nichtmal auf deinem eigenen System die Ergebnisse vergleichen kannst, da du den Zeitpunkt des Hochtaktens nicht völlig beeinflussen kannst.
Entweder schaltest du diese Funktion irgendwo im System ab, oder du sorgst dafür, daß der Computer bereits vor deiner Messung ordentlich beschäftigt ist. Zum Beispiel könntest du zwei solcher Schleifen benutzen, die erste heizt nur die CPU an, und die zweite macht die eigentliche Messung.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:18 Di 03.05.2011 | Autor: | felixf |
Moin Event_Horizon,
stimmt, das ist auch sehr wichtig.
Und man sollte nicht vergessen: Laufzeitumgebungen mit Garbage Colelctor -- so wie Java -- sind sowieso sehr kompliziert was Zeitmessung angeht, da der GC jederzeit losfeuern kann. Deswegen sollte man mehrere Messungen machen und Ausreisser rauswerfen.
LG Felix
|
|
|
|