Java VM macht einfach Pause



  • Tag zusammen.

    Ich habe da ein Problem.
    Ich benutze das Java2SDK 1.4.2_04 von Sun und MS Windows XP Pro.
    Für folgenden (jetzt richtigen 🙄 ) Code:

    public class Test {
        public static void main(String args[]) {
            while(true) {
                System.out.println("" + System.currentTimeMillis());
            }
        }
    }
    

    bekomme ich folgenden Output:

    ...
    1088691361343
    1088691361359
    ...
    1088691361359
    1088691361640
    ...
    1088691361640
    1088691361656
    ...
    1088691361656
    1088691361671
    ...

    also öfter mal ca 16 Millisekunden Pause. Ich hätte eigentlich nur den Wechsel von einer auf die nächste Millisekunde erwartet.
    Es läuft nix anderes auf meinem Rechner. Die Pause ist also von der VM.

    Weiss jemand wieso diese Pause entsteht? GarbageCollection? Sonst was?

    Danke für die Hilfe

    basedow



  • Glaubst du dein Windows gibt deinem Programm 100% CPU-Time?



  • Du wirst unter verschiedenen Betriebssystemen sicherlich andere Zeiten bekommen. Mit den normalen Timern die es z.B. in der WinAPI gibt, sind je nach Windows Version verschiedene Auflösungen verbunden; da ist es unter Windows 95/98/NT/2000/XP/CE anders.


  • Mod

    basedow schrieb:

    also öfter mal ca 16 Millisekunden Pause. Ich hätte eigentlich nur den Wechsel von einer auf die nächste Millisekunde erwartet.
    Es läuft nix anderes auf meinem Rechner. Die Pause ist also von der VM.

    Weiss jemand wieso diese Pause entsteht? GarbageCollection? Sonst was?

    Das ist keine Pause. Das liegt daran, dass die Uhr nicht so genau funktioniert. Das ist genau das gleiche, wie wenn du versuchst, mit einer Uhr, die maximal hundertstel Sekunden messen kann, tausendstel Sekunden zu messen: Du hast über eine gewisse Zeit einen konstanten Wert, der sich dann plötzlich in einem "großen" Schritt ändert.

    Ab Java 1.5 gibt es System.nanoTime. Diese Methode läuft genauer. Wenn du also Millisekunden messen möchtest, dann mach das mit System.nanoTime.



  • Und selbst damit sind natürlich die Ergenisse nicht immer gleich.



  • Alles klar,

    das wars. Die Zeit ist einfach nicht richtig. hab das ganze in C++ nachgebaut und hatte den gleichen Effekt.

    Vielen Dank für eure Hilfe.

    basedow



  • Irgendwo habe ich mal gelesen, dass der Timer unter Java-VM für Windows nicht den hochäuflösenden Timer verwendet. Der Autor hat dann den Tipp gegeben den Timer aus Java3D zu verwenden, wenn die Zeit wichtig ist.

    Hier gibts mehr dazu zu lesen (im ersten Kapitel)
    http://fivedots.coe.psu.ac.th/~ad/jg/



  • Es wurde doch schon System.nanoTime() erwähnt. Was willst du mehr (vorausgesetzt, er funktioniert).


  • Mod

    Optimizer schrieb:

    (vorausgesetzt, er funktioniert).

    Wie meinst du das?
    Hier ist mal ein kleines Testprogramm von mir:

    public class TestNano
    {
       public static void main(String[] args)
       {
          for(int i = 0 ; i < 10 ; ++i)
          {
             System.out.println(-(System.nanoTime() - System.nanoTime()));
          }
       }
    }
    

    Output bei mir:

    4000
    5000
    4000
    5000
    5000
    5000
    5000
    4000
    4000
    5000
    

    Mit anderen Worten: Bei mir kann man mit System.nanoTime() mit einer Genauigkeit von 4-5 Mikrosekunden Zeit messen.



  • Ich hatte es nur nicht getestet. 😉
    Da nicht mal die ms genau stimmen, wollte ich nicht voreilig behaupten, dass es seinen Dienst perfekt tut. 🙂



  • Optimizer schrieb:

    Es wurde doch schon System.nanoTime() erwähnt. Was willst du mehr (vorausgesetzt, er funktioniert).

    Sollte das auf allen Platformen laufen? Also unter Linux (Java 1.4.2_04) erkennt er die Methode nicht. (Hab das TestNano Progrämmchen benutzt)
    Also (momentan) würde ich das nicht als die beste Lösung bezeichnen...



  • Gregor hat auch geschrieben "ab Java 1.5". Und ja, es läuft auf allen Plattformen, wo eine 1.5 VM installiert ist. Auf dem Handy vermutlich nicht so genau wie auf einem Windows-PC, aber immerhin. 😉
    Warum benutzt du überhaupt noch Java 1.4? 🙄



  • Oops, sorry sollte ein wenig besser lesen...

    Nun gut mit Java 1.5 oder läufts dann auch unter Linux. Der Output lag sogar nie über 2000...

    Ich benutze noch Java 1.4, weil ich mit der Beta 1 von 1.5 Probleme hatte, es lief nicht alles wie es sollte. Mit der Beta 2 gehts jetzt zwar besser, aber ich will auf der sicheren Spur bleiben 🙄



  • Die Beta 2 ist sicher, mach dir da keine Sorgen. 🙂


Anmelden zum Antworten