Geschwindigkeit und Genauigkeit bei Zeitmessung

Status
Nicht offen für weitere Antworten.

poschdi

Mitglied
Ich hab mal eine allgemeine Javafrage zur Geschwindigkeit. Dazu erst mal eine kurze Situationsbeschreibung. Ich hatte vor einiger Zeit angefangen, für den Rennsport eine Zeitmessanlage mittels Infrarot zu entwickeln. Ein Fahrzeug bekommt dabei einen Sender, der ein codiertes Lichtsignal sendet. Wird dies von einem Empfänger am Streckenrand erkannt, so wird dieser Code an eine Software weitergereicht. Aktuell ist diese in VB6 geschrieben. Die Software berechnet dann die Rundenzeit und fertigt verschiedene Statistiken an. Da VB aber keine Threads unterstützt, kann es hier schon mal zu Unterbrechungen führen. Z.B. Wenn man etwas Drucken möchte wird immer direkt das ganze Programm blockiert. Prinzipell wäre es zwar auch möglich die Zeit direkt im Empfänger zu messen, dies hätte aber auch Nachteile, z.B. wenn man mit mehreren Empfängern auch Zwischenzeiten berechnen möchte.

Nun steht die Frage im Raum, wie man das verbessern kann. Da ich ein bisschen Ahnung von Java noch aus dem Studium habe und diese gerne wieder etwas auffrischen möchte, würde ich Java bevorzugen. Nun weiss ich aber nicht, ob ich hiermit dort ähnliche Probleme bekomme. Es sollte also ein Thread im Hintergrund laufen, der ständig die serielle Schnittstelle abhört und sobald etwas empfangen wird die vergangene Zeit berechnet. Bekommt man das mit Java einigermaßen genau hin?

gruß poschdi
 

Bleiglanz

Gesperrter Benutzer
die Frage ist WIE GENAU?

schon bei einer stinknormalen System.currentTimeMillis hat man eine ungenauigkeit von 20-50 ms, hängt vom OS ab

wenn du noch die serielle Schnittstelle und den IO zeugs und die Tatsache, dass Threads dabei sind berücksichtigst, würde ich 500ms MINIMUM Ungenauigkeit einplanen
 

poschdi

Mitglied
Wenn man bei der Übertragungzeit vom Empfänger zum PC davon ausgeht, dass diese immer ähnlich ist, muss man diese Zeit nicht so genau nehmen. Also, wenn es jedes mal zwischen Empfänger und Software 500ms dauert, so wird die Rundenzeit dadurch ja nicht beeinflusst. Kristischer wäre es, wenn es mal 100ms und mal 500ms wären. Daher würde es mich interessieren, wieviel Zeitschwankung Java hier ausmachen kann, bzw. ob und wieviel andere Sprachen hier besser sind. 20 bis 50ms wären wohl vertretbar. Die offizellen Zeitnahmen via Transponderschleife sind übrigens auch ned 100% genau, und für die F1 ist auch ned gedacht ;)

Mit dem aktuellen VB6 Programm, komme ich einigermaßen genau an die offizelle Zeit ran. Wobei ich nicht weiss, wer hier wieweit von der wirklichen Zeit entfernt ist ;)
 
S

stev.glasow

Gast
poschdi hat gesagt.:
Kristischer wäre es, wenn es mal 100ms und mal 500ms wären.
Das meinte Bleiglanz, obwohl ich nicht verstehe wieso das so hoch sein sollen.

[edit]
Wie sieht es eigentlich mit der Genauigkeit von System#nanoTime() aus? Wenn die ähnlich ungau wie System#currentTimeMillis() ist verstehe ich den Sinn dieser Funktion nicht.
 

poschdi

Mitglied
Hmm aber die Dauer wie lange ein Zeichen von A nach B braucht, sollte doch bei einer seriellen Verbindung gleichbleiben. So könnte ja nur die Zeit schwanken wie lang es dauert, bis das Zeichen aus dem Puffer gelesen wird. Dort würde ich auch ned verstehen, warum dies sich in einem so großen Rahmen abspielen soll.
 

Bleiglanz

Gesperrter Benutzer
nanoTime ist wohl nur ein Gag

wenn mehrere Threads laufen hat man eben bei java überhaupt keine Kontrolle darüber, wann einer wieder aufwacht und an der reihe ist

rundenmessung liegt an der seriellen schnittstelle

ABER der lese-thread schläft gerade

d.h. es gibt eine Verzögerung, bis der das nächste mal aufwacht

und da würde ich doch grössere Schwankungen vermuten...
 
S

stev.glasow

Gast
Und wenn man einen Thread macht der nur fürs aufnehmen der Daten zuständig ist, (sprich der auf der Schnittstelle liest) und dessen Priorität höher setzt als die der anderen?
Dann sollte er doch eigentlich sofort "aufwachen" oder zumindest sollten dann die Verzögerungen geringer sein, oder?
 

Wildcard

Top Contributor
ot.gif

stevg hat gesagt.:
[edit]
Wie sieht es eigentlich mit der Genauigkeit von System#nanoTime() aus? Wenn die ähnlich ungau wie System#currentTimeMillis() ist verstehe ich den Sinn dieser Funktion nicht.
Hab mich auch schon gefragt wie genau nanoTime wirklich ist.
Das einzige was ich bei SUN dazu finde ist:
SUN hat gesagt.:
The actual precision of System.nanoTime is platform-dependent.
:bae:
Nach dem was ich bisher gelesen habe funktioniert die Zeitmessung aber nach einem anderen Prinzip als currentTimeMillis und soll (zumindest) differenzierter sein.
Zum Vergleich die kleinste Änderung die System.currentTimeMillis anzeigen kann:
Windows 95/98 : 55ms
2000/NT/XP : 10-15ms
insofern kanns ja nur besser werden.

hier mal mein eigener 'Pseudo-Benchmark' :wink:
Code:
public class TimeBenchmark
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		for(int i=0;i<1000000;i++)
		{
			
		}
		long time1 = -System.nanoTime();
		time1 += System.nanoTime();
		long time2 = -System.nanoTime();
		time2 += System.nanoTime();
		long time3 = -System.nanoTime();
		time3 += System.nanoTime();
		long time4 = -System.nanoTime();
		time4 += System.nanoTime();

		long time5 = -System.currentTimeMillis();
		time5 += System.currentTimeMillis();
		long time6 = -System.currentTimeMillis();
		time6 += System.currentTimeMillis();
		long time7 = -System.currentTimeMillis();
		time7 += System.currentTimeMillis();
		long time8 = -System.currentTimeMillis();
		time8 += System.currentTimeMillis();
		
		System.out.println("Nano:");
		System.out.println(time1);
		System.out.println(time2);
		System.out.println(time3);
		System.out.println(time4);
		System.out.println("Milli:");
		System.out.println(time5);
		System.out.println(time6);
		System.out.println(time7);
		System.out.println(time8);
		
	}

}

Das kommt raus:
Nano:
12850
8102
7264
7264
Milli:
0
0
0
0

zumindest sieht man das es nicht
System.currentTimeMillis() * 1000 ist :wink:
 

Bleiglanz

Gesperrter Benutzer
AFAIK ist das mit den Prioritäten auch so eine Sache

selbst bei der höchsten Priorität dürfen ja die anderen nicht verhungern....

aber man könnte wahrscheinlich (durch geschicktes Design) schon irgendwie mit der Sache klarkommen

etwa einen ganz eigenen Betriebssystem Prozess (von mir aus auch in Java gemacht) der NUR auf eingehende Daten von der seriellen Schnittstelle horcht und diese sofort in eine Datenbank schaufelt...
 
S

stev.glasow

Gast
Kannst ja dann mal berichten wie du das gelöst hast und wie gross die Abweichungen sind.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
T Geschwindigkeit beim Generieren erhöhen? Allgemeine Java-Themen 7
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
byte JMockit - Geschwindigkeit Allgemeine Java-Themen 7
B Verzeichnis durchsuchen geschwindigkeit optimieren Allgemeine Java-Themen 6
R Parser: Datei auslesen, Datei erstellen - Geschwindigkeit Allgemeine Java-Themen 16
G java spiel (geschwindigkeit) Allgemeine Java-Themen 37
F Geschwindigkeit messen Allgemeine Java-Themen 7
E Geschwindigkeit static Allgemeine Java-Themen 6
O RXTX Geschwindigkeit? Codebeispiel dabei. Allgemeine Java-Themen 21
P Geschwindigkeit von Java GUIs Allgemeine Java-Themen 45
J Http/Https Geschwindigkeit Allgemeine Java-Themen 14
B java geschwindigkeit Allgemeine Java-Themen 16
O Geschwindigkeit Fortran und Java Allgemeine Java-Themen 11
J JCopy & Geschwindigkeit? Allgemeine Java-Themen 4
A Geschwindigkeit Java unter Linux Allgemeine Java-Themen 9
M Geschwindigkeit RXTX JAVA Allgemeine Java-Themen 3
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
T Geschwindigkeit bei Polygonen und BufferedImage Allgemeine Java-Themen 9
R Geschwindigkeit herausfinden Allgemeine Java-Themen 2
G Genauigkeit von Double Allgemeine Java-Themen 2
S Warmup für Lineare-Suche mit Zeitmessung Allgemeine Java-Themen 2
C Zeitmessung mit Java Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben