Forum: PC-Programmierung Zeitmessung mit clock_gettime()


von Christian H. (chris125)


Lesenswert?

Hallo zusammen,

ich bin auf ein recht komisches Ergebnis gestoßen, bei einer Zeitmessung 
mit clock_gettime().

Der Code dazu:
1
clock_gettime(CLOCK_REALTIME, &time_start);
2
hw.dispatch();
3
clock_gettime(CLOCK_REALTIME, &time_end);

Die dispatch() Funktion in der Mitte fordert von einem FPGA Daten an und 
wartet auch bis diese mittels UDP übertragen wurden.
Dabei erhalte ich folgende Ergebnisse als vergangene Zeit:

1. Mit Wireshark im Hintergrund: 17,53 Sekunden

2. Ohne Wireshark: 0,033 Sekunden (das Ergebnis schwankt stark ist aber 
immer im Millisekunden-Bereich)

Und das ist für die Versendung von 400MByte Daten im Gigabit Ethernet 
viel zu kurz. Außerdem dauert die Ausführung des Programmes in etwa 
gleich lang.

Wie kommt es zu diesem starken Unterschied ? Ist es möglich das die 
clock_gettime() Funktion von dem Betriebssystem so stark gestört wird, 
oder wird eventuell die dispatch() Funktion unterbrochen ?

Die Daten werden in beiden Fällen gesendet, dass kann man am FPGA-Board 
erkennen (LED blinkt mehrere Sekunden lang).

Grüße

Christian

von Peter II (Gast)


Lesenswert?

zum Zeit messen ist CLOCK_REALTIME falsch, denn die Zeit kann von 
NTP-Daemon geändert werden. Richtiger müsste man CLOCK_MONOTONIC 
verwenden.

Das wird aber das Problem nicht erklären.

Sicher das du auf das ende der Übertragung wartest, nicht das sie nur in 
den Puffer geschrieben werden?

von Christian H. (chris125)


Lesenswert?

Das in den Puffer schreiben kann aber kaum 17 Sekunden dauern wenn 
Wireshark läuft, dass wäre sehr langsam.
Außerdenm hört mit dem Ende der Messung (also auch des Programms) auch 
die LED des FPGA-Boardes auf zu blinken, damit ist die Übertragung auch 
gleichzeitig beendet.

Mit CLOCK_MONOTONIC komme ich auf das selbe Ergebnis.

Mein Betriebssystem ist übrigens SLC6, falls das einen Einfluss haben 
sollte.

von Peter II (Gast)


Lesenswert?

Christian H. schrieb:
> Mein Betriebssystem ist übrigens SLC6, falls das einen Einfluss haben
> sollte.

dann solltest du noch etwas mehr zu der Umgebung Sachen. Wo läuft denn 
Wireshark und auf welchen System wird die Zeit gestoppt? Wer überträgt 
von Wo nach Wo?

von Christian H. (chris125)


Lesenswert?

Wireshark läuft auf dem selben Rechner auf dem auch die Zeit gemessen 
wird, daher die Verzögerung wenn Wireshark aktiv ist.

Der dispatch() fragt eine gewisse Menge an Daten vom FPGA an und wartet 
dann bis er diese auch erhalten hat. Die Übertragung erfolgt mittels 
UDP, daher werden nicht erhaltene Pakete ignoriert und nicht noch einmal 
geschickt.

Da Wireshark auf der selben Schnittstelle horcht, auf der auch gesendet 
wird verlangsamt er das senden in etwa um die hälfte der Ursprünglichen 
Geschwindigkeit.

Als ich den selben Test mit einer TCP-Übertragung ausgeführt habe, also 
diesmal dispatch() des TCP mit Überwachung und erneuter Übertragung bei 
Packetverlust, konnte ich in beiden Fällen (auch ohne Wireshark) eine 
Zeit messen.
Da die gemessene Geschwindigkeit aber zu niedrig war für meine Wünsche 
(nur 55 MByte/s und das im Gigabit Ethernet), also jetzt der Test mit 
UDP, welches dank kleinerem Overhead schneller sein sollte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.