kann es sein dass System.currentTimeMillis() recht ungenau ist?
Ich wenn ich eine schleife programmiere wo in einer Variable immer die Zeit der letzten Zeitabfrage gespeichert wird und dann beim nächsten durchgang mit println der Unterschied zur momentanen Zeit ausgegeben.
Wenn ich es ausführe, kommt bei mir dauernd "0" und dann zwischendurch immer mal "15" oder "16".
Was also heißt dass es 15/1000stel sekunden genau ist und nicht 1/1000?
Was mich dabei wundert, dass diese methode in einem Tutorial dazu empfohlen wurde um einen FPS counter zu programmieren. Ist das Systemspezifisch wie genau diese Funktion ist? Gibt es da eine genauere Funktion?
Es gibt da noch die System.nanoTime(), aber die gibt keine wirkliche Zeitangabe, sondern ist wirklich nur zur Messung von Zeitdifferenzen gut, was für einen FPS-Counter natürlich ideal ist. Aber Vorsicht: das gibt es erst seit Java 1.5, also falls Du kompatibel mit älteren VMs bleiben willst, ist das natürlich Humbug.
EDIT: Die bessere Lösung (wenn man nanoTime nicht nutzen will) ist es, innerhalb einer Sekunde die Frames zu zählen, die wirklich gezeichnet werden und nach Ablauf der Sekunde (checken mit Calendar oder GregorianCalendar) die gezählten Frames auszugeben und den Zähler wieder auf null zu setzen.
ich habe auch diese Beobachtung,
aber ein Beweis wäre sie so für sich nicht,
wenn du zwischen jeder Messung println machst, dann ist das ja eine extrem aufwendige Operation,
vielleicht wird die für ein paar Aufrufe intern gespeichert (0 ms) und dann werden irgendwann mal alle Ausgaben an die Konsole weitergeleitet, was gerne 15 ms dauern kann..
oder irgendwelche Betriebssystem-Threads unterbrechen Java für diese Zeit (man ist ja nicht allleine)
oder gar interne VM-Verwaltungsthreads/ Speichermanagement/ Garbage Collector,
es ist wohl so ungenau, das stimmt schon,
aber diese Messung alleine sagt nicht viel aus
also meiner Meinung nach durchaus möglich,
dass ein Java-Programm da eine bedeutende Zeit unterbrochen wird,
oder meinst du, dass dies ausgeschlossen ist?
dass die Strings nicht intern gecacht werden mag ich gerne glauben, aber wie soll das Programm dies beweisen?
so schnell kann man ja gar nicht schauen, ob nun der Output nun zum Zeitpunt x oder erst 15ms später ausgegeben wird
Erstmal auch Danke von mir für das Programm, für die Differenzberechnung war ich gerad zu faul :applaus:
also meiner Meinung nach durchaus möglich,
dass ein Java-Programm da eine bedeutende Zeit unterbrochen wird,
oder meinst du, dass dies ausgeschlossen ist?
Nein, das hab ich ja auch nicht bezweifelt, das ist sogar de Facto so (wir haben ja nunmal eine Umgebung mit mehreren parallel laufenden Threads, wenn Nano mehr als normal springt, hatte zwischendurch ein anderes Programm die CPU-Zeit). Die Ungenauigkeit von currentTimeMillis ist damit de Facto sogar bewiesen, weil der Sprung der currentTimeMillis völlig getrennt von der Zuteilung der Rechnerzeit und damit vom Sprung von nanoTime sein kann (der Wahrscheinlichkeit nach liegen die Sprünge aber natürlich häufiger parallel). Die Auflösung von currentTimeMillis liegt damit (offensichtlich) wirklich bei 16, minimal 15ms.
dass die Strings nicht intern gecacht werden mag ich gerne glauben, aber wie soll das Programm dies beweisen?
Hm, ich kann nicht mit 100%iger Sicherheit sagen, ob da ein internes Caching durchgeführt wird oder nicht, aber wenn, dann kein Caching der Inhalte, die dann in mehreren aufeinanderfolgenden Out's ersetzt werden, sondern höchstens Sammelausgaben der unterschiedlichen Inhalte (sonst würde er nicht nur currentTimeMillis cachen, sondern auch die nanoTime). Das Ausgeben auf der Konsole müßte ja eigentlich von Betriebssystemseite erfolgen, die VM wird das wohl direkt durchleiten...wäre schön, wenn man vielleicht ein paar Vergleichswerte verschiedener Betriebssysteme und Rechnerstärken hätte, dann könnte man mal schauen, ob z.B. unter Linux die "Uhren anders ticken" und ob es was mit der Betriebssystemseite zu tun hat.
P.S.: Kann man sich aber drauf einigen, daß nanoTime für den angesprochenen Einsatzzweck wesentlich besser geeignet ist als currentTimeMillis?