System.currentTimeMillis() recht ungenau?

Status
Nicht offen für weitere Antworten.

Serge

Mitglied
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?
 

FatFire

Bekanntes Mitglied
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.
 
S

SlaterB

Gast
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
 

FatFire

Bekanntes Mitglied
es ist wohl so ungenau, das stimmt schon,
aber diese Messung alleine sagt nicht viel aus
Nein, diese Messung alleine sagt nicht viel aus, hast Du Recht, aber spätestens beim direkten Vergleich der Funktionen fällt es einem genau auf:
Code:
import java.util.Calendar;

public class Genauigkeit {

	public static void main(String args[]){
		Calendar cal;
		while(true){
			cal = Calendar.getInstance();
			System.out.println("Nano: " + String.valueOf(System.nanoTime()));
			System.out.println("Millis: " + String.valueOf(System.currentTimeMillis()));
			System.out.println("Calendar: " + String.valueOf(cal.getTimeInMillis()));
		}
	}
}
Man beachte die ständige Änderung von Nano, was auch die Theorie mit der internen Speicherung verwirft.

P.S.: Weniger mutmaßen, mehr Coden.
 
S

SlaterB

Gast
nettes Programm, danke



aber auch bei Nano gibt es viele Sonderheiten,
die (noch) Platz für meine Spekulationen lassen ;)

mit verändertem Programm:
Code:
int i = 0;
long nanoAlt = 0;
long milliAlt = 0;
long nano = 0;
long milli = 0;
DecimalFormat d = new DecimalFormat("00000000");
while (i < 100)
{
    i++;

    milliAlt = milli;
    nanoAlt = nano;
    nano = System.nanoTime();
    milli = System.currentTimeMillis();

    System.out.println("Nano: " + String.valueOf(nano) + "  Millis: " + String.valueOf(milli) 
       + " Dif Milli: "+ d.format(milli - milliAlt) + "  Dif Nano: " + d.format(nano - nanoAlt));

}


kommt es durchaus ab und zu auch bei Nano zu Sprüngen:

Nano: 21084611266515 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00061739
Nano: 21084611355633 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00089118
Nano: 21084611907658 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00552025
Nano: 21084611978058 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00070400
Nano: 21084612038122 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00060064
Nano: 21084612098185 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00060063



und wenn Milli mal plötzlich springt, dann reagiert Nano ganz unterschiedlich,
mal passiert nix, oft springt aber auch Nano um bedeutende Größen:


Nano: 21026541843446 Millis: 1170423677345 Dif Milli: 00000000 Dif Nano: 00108114
Nano: 21026541951002 Millis: 1170423677345 Dif Milli: 00000000 Dif Nano: 00107556
Nano: 21026542061351 Millis: 1170423677345 Dif Milli: 00000000 Dif Nano: 00110349
Nano: 21026556012286 Millis: 1170423677360 Dif Milli: 00000015 Dif Nano: 13950935
Nano: 21026556150013 Millis: 1170423677360 Dif Milli: 00000000 Dif Nano: 00137727
Nano: 21026556267067 Millis: 1170423677360 Dif Milli: 00000000 Dif Nano: 00117054
Nano: 21026556376299 Millis: 1170423677360 Dif Milli: 00000000 Dif Nano: 00109232


Nano: 21084607799874 Millis: 1170423735405 Dif Milli: 00000000 Dif Nano: 00070121
Nano: 21084607870832 Millis: 1170423735405 Dif Milli: 00000000 Dif Nano: 00070958
Nano: 21084607937321 Millis: 1170423735405 Dif Milli: 00000000 Dif Nano: 00066489
Nano: 21084608022528 Millis: 1170423735421 Dif Milli: 00000016 Dif Nano: 00085207
Nano: 21084608092369 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00069841
Nano: 21084608158578 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00066209
Nano: 21084608244343 Millis: 1170423735421 Dif Milli: 00000000 Dif Nano: 00085765


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 ;)
 

FatFire

Bekanntes Mitglied
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?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I System.currentTimeMillis() nutzen Java Basics - Anfänger-Themen 2
K System.currentTimeMillis() und die Sommerzeit Java Basics - Anfänger-Themen 5
C System.currentTimeMillis Java Basics - Anfänger-Themen 5
C System.currentTimeMillis(); Java Basics - Anfänger-Themen 13
T XSLT System.currentTimeMillis() Java Basics - Anfänger-Themen 6
D System.out.println Java Basics - Anfänger-Themen 1
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
paulen1 Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife Java Basics - Anfänger-Themen 8
M Keine Ausführung von System.out.println() Java Basics - Anfänger-Themen 3
O System.out array Java Basics - Anfänger-Themen 4
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
C System.out.println - Parameterübergabe funktioniert nicht Java Basics - Anfänger-Themen 2
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
C system cannot be resolved Fehler in Eclipse Java Basics - Anfänger-Themen 18
S Anweisungen verstehen System.out.print/println Java Basics - Anfänger-Themen 2
B Warum werden meine System.out.println's übersprungen? Java Basics - Anfänger-Themen 9
R Erste Schritte Eclipse - Java - System.out.println(); funktioniert nicht Java Basics - Anfänger-Themen 2
C System.in.read() Boolsche Werte vergleichen Java Basics - Anfänger-Themen 8
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
T System.out.println() Java Basics - Anfänger-Themen 5
M System.property persistieren Java Basics - Anfänger-Themen 6
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
A Input/Output System.out Ausgabe aktualisieren, ohne Konsole vollzuspamen Java Basics - Anfänger-Themen 2
R Input/Output Frage zu System.out.println Java Basics - Anfänger-Themen 5
S System.out.printIn("Hello, World!"); Java Basics - Anfänger-Themen 3
A Passwort System Java Basics - Anfänger-Themen 4
N Input/Output System.in funktioniert nicht Java Basics - Anfänger-Themen 4
S Input/Output System.out.println - Manipulieren bzw. Alternative..? Java Basics - Anfänger-Themen 2
E Was ist die JRE System Library? Java Basics - Anfänger-Themen 3
V System.out.println zu JTextArea Java Basics - Anfänger-Themen 6
V OOP System.out.println(Objekt) Java Basics - Anfänger-Themen 3
D int x in System.out.println(), aber wie? Java Basics - Anfänger-Themen 1
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
N System Proxy verwenden Java Basics - Anfänger-Themen 0
C system.out.printf mit streams benutzen Java Basics - Anfänger-Themen 7
L system.print.out geht nicht Java Basics - Anfänger-Themen 11
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
F System kann die Datei nicht finden Java Basics - Anfänger-Themen 7
R ArrayList - System.out.println nur einmal, statt 10 mal Java Basics - Anfänger-Themen 5
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D system.out.println >> JTextArea Java Basics - Anfänger-Themen 1
O Frage zu System.out.println() Java Basics - Anfänger-Themen 1
G System.out.printf geht nicht Java Basics - Anfänger-Themen 6
A System.out.println() - Aufbau Java Basics - Anfänger-Themen 1
D JDK installieren No JVM could be found on your system. Java Basics - Anfänger-Themen 9
Z System(einstellungen) per Java ändern/Steuern | Betriebssystembezogen Java Basics - Anfänger-Themen 7
M Variablen Ausgabe bei System.out.format? Java Basics - Anfänger-Themen 3
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
D kleines problem bei system.out.println schreibweise Java Basics - Anfänger-Themen 6
J Umgang mit System.out.println() und .print() Java Basics - Anfänger-Themen 6
W Input/Output System.in.read erzeugt nicht, was ich will Java Basics - Anfänger-Themen 1
C Input/Output System.in.read() gibt nicht -1 zurück? Java Basics - Anfänger-Themen 3
C Kleines Problem mit System.out.print Java Basics - Anfänger-Themen 1
G classname.System.out.println(); ? Java Basics - Anfänger-Themen 2
H Einfluss von System.out auf Programm Java Basics - Anfänger-Themen 2
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
G Thread stoppen mit System.in.read() Java Basics - Anfänger-Themen 13
M CSV-File aus datei system einlesen Java Basics - Anfänger-Themen 3
R Char wird in System.out.print(); nicht ausgegeben Java Basics - Anfänger-Themen 6
T System.out.print : Frage zu Aufbau Java Basics - Anfänger-Themen 4
P Update System Java Basics - Anfänger-Themen 16
T If ; else error on system token delete Java Basics - Anfänger-Themen 5
M System.getProperty("java.vm.version") liefert build-Version Java Basics - Anfänger-Themen 4
O If in System.out.println Java Basics - Anfänger-Themen 11
J HILFE Benutzen einer Klasse aus JRE System Library Java Basics - Anfänger-Themen 4
T Erste Schritte import java.lang.System.out Java Basics - Anfänger-Themen 4
N Erste Schritte Ausgabe in System.out Java Basics - Anfänger-Themen 13
D Scanner(System.in) Schleife Java Basics - Anfänger-Themen 7
G Input/Output System.in.read & Scanner Java Basics - Anfänger-Themen 2
H System.out umleiten Java Basics - Anfänger-Themen 5
J Erste Schritte System.out.print (Fehlermeldung) Java Basics - Anfänger-Themen 14
C System.out in String schreiben Java Basics - Anfänger-Themen 2
P System - Tage erkennen ( System Time ?) Java Basics - Anfänger-Themen 3
lulas[]args Alternative zu System.err.println(); Java Basics - Anfänger-Themen 5
X Eclipse System.out.print fehler Java Basics - Anfänger-Themen 5
K char-int-Addition in System.out.print Java Basics - Anfänger-Themen 3
O Tabelle Formatieren mit system.out.format Java Basics - Anfänger-Themen 11
F System.getProperty("line.separator") funkt. nicht Java Basics - Anfänger-Themen 4
N Erste Schritte System.err und System.out Java Basics - Anfänger-Themen 5
Z System.out.format, Hilfe. Java Basics - Anfänger-Themen 14
C System.out.println Java Basics - Anfänger-Themen 4
R System.exit mit String als Rückgabedatentyp Java Basics - Anfänger-Themen 3
G Input/Output System.err zusätzlich in Datei schreiben Java Basics - Anfänger-Themen 27
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
I Input/Output System.out.println formatierung? möglich? Java Basics - Anfänger-Themen 2
J Schleife und system.exit(); Java Basics - Anfänger-Themen 2
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
D Frage zu System.out.println() Funktion Java Basics - Anfänger-Themen 6
J System.out - Zwischenablage Java Basics - Anfänger-Themen 5
T System.out.printf Zeilenumbruch nach x Stellen Java Basics - Anfänger-Themen 4
Guybrush Threepwood System.exit(int status) Java Basics - Anfänger-Themen 3
L Kein System.out Java Basics - Anfänger-Themen 14
M System.nanoTime Java Basics - Anfänger-Themen 3
F System.out.printIn Java Basics - Anfänger-Themen 15
jgh System.out finden Java Basics - Anfänger-Themen 4
hdi System.exit() Status Code in Eclipse? Java Basics - Anfänger-Themen 2
D Problem mit System.out Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben