Forum: Compiler & IDEs C++: Zeitdifferenz mit time_t


von leo (Gast)


Lesenswert?

Hallo,

für eine Anwendung in C++ wird eine Zeidifferenzberechnung benötigt.
In C++ gibt es den Typ time_t. Wie kann damit eine Zeitdifferent in 
Mikrosekunden zwischen zwei Zeitstempeln berechnet werden?

: Verschoben durch User
von Oliver (Gast)


Lesenswert?

Vermutlich so:
1
time_t diff = zeit2 - zeit 1;

Oliver

von leo (Gast)


Lesenswert?

Ich benötige die Dieffernz von folgenden Zeitstempel 
[stunden,minuten,sekunden,millisekunden]:

Zeitstempel 1:  TIME    08:58:29.713453
Zeitstempel 2:  TIME    08:58:30.422930

von Oliver (Gast)


Lesenswert?

Ja, und? Man berechnet eine Differenz in C über den Operator "-". Das 
ist sie Anbeginn der Zeitrechnung so, und daran hat sich nach meiner 
Kenntniss auch nie etwas geändert.

Wo also ist das Problem?

Oliver

von micha (Gast)


Lesenswert?

Das hängt etwas vom verwendenten System ab; time_t is IMHO nicht 
standardisiert, also in der Doku zu Deinem Compiler schauen was es genau 
representiert.

von Karl H. (kbuchegg)


Lesenswert?

Ich werd nie verstehen, was daran so schwer ist, die paar Stichworte die 
man hat, einfach mal in Google reinzugeben und den suchen zu lassen.

Mit "time_t" oder "C++ time_t" findet Google in den ersten paar Links 
erstklassige Referenzen. Da liest man dann eben einbischen, folgt 
vielleicht noch dem einen oder anderen vielversprechenden Link und in 
ein paar Minuten hat man alle Informationen, die man braucht.

Wenn man keine vernünftige Literatur auf dem Schreibtisch stehen hat 
(was sowieso schon mal ein Fehler ist), dann sucht doch bitte mittels 
Google das Web ab! Ihr habt 90% allen Wissens, das die Menschheit je 
besessen hat mittels ein paar Tastendrücken zur Verfügung. Warum nutzt 
ihr dieses Potential denn nicht. Den jeweils neuesten Ego-Shooter findet 
ihr ja auch problemlos im Web.

http://www.cplusplus.com/reference/ctime/

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

1. Vollkommen richtig.

2. Vor allem würde man dann solche peinlichen Antworten vermeiden, wie 
sie in diesem Thread leider wieder vorkommen.

Seit wann stehen in time_t überhaupt Millisekunden drin?
In der Regel ist das eben nicht der Fall.

von leo (Gast)


Lesenswert?

Sorry muss mich korrigieren. Der Typ time_t beinhaltet natürlich keine 
Millisekunden. Diese Millisekunden kommen bei mir von wo anders her.
Muss zuerst die Differenz in Sekunden von time_t berechnen und im 
Anschluss die Differenz von den Millisekunden hinzuandieren.

von Karl H. (kbuchegg)


Lesenswert?

leo schrieb:
> Sorry muss mich korrigieren. Der Typ time_t beinhaltet natürlich keine
> Millisekunden. Diese Millisekunden kommen bei mir von wo anders her.
> Muss zuerst die Differenz in Sekunden von time_t berechnen und im
> Anschluss die Differenz von den Millisekunden hinzuandieren.

Ja und.

Mit den Funktionen und Datentypen aus dem Standard ctime Header (oder 
time.h in C) ist das doch kein Problem.

Du füllst eine struct tm aus, lässt dir die mit einer Standard Funktion 
auf ein time_t umwandeln, benutzt difftime um die Differenz zu erhalten 
und wandelst das Ergebnis wieder in einen struct tm um dann nach 
Herzenslust die Tage, Stunden, Minuten etc. aus dieser Struktur 
rauszuholen.

Alle Zutaten sind im Link vorhanden. Brauchst nur ein bischen lesen und 
die Beispiele studieren.

von Peter II (Gast)


Lesenswert?

leo schrieb:
> Sorry muss mich korrigieren. Der Typ time_t beinhaltet natürlich keine
> Millisekunden. Diese Millisekunden kommen bei mir von wo anders her.
> Muss zuerst die Differenz in Sekunden von time_t berechnen und im
> Anschluss die Differenz von den Millisekunden hinzuandieren.

sagt doch erst mal was du genau messen willst. Die time Funktionen sind 
nicht für absolute kurze genaue Zeiten geeignet. Was passiert wenn NTP 
die Uhrzeit korrigiert?

Wenn es um exakte Zeitenmessungen geht nimmt man unter Windows z.b. 
QueryPerformanceCounter (gibt es auch unter Linux). Dann muss man 
eventuell noch beachtet das bei AMD jeder CPU-Kern seine eigene zeit 
hat. Da kann es schnell mal passieren das man eine negative Differenz 
hat wenn dazwischen ein core-wechsel stattgefunden hat.

von (prx) A. K. (prx)


Lesenswert?


von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> http://www.cplusplus.com/reference/ctime/difftime/

Calculates the difference in seconds between beginning and end.

und dann * 1000000 damit er Mikrosekunden hat?

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> und dann * 1000000 damit er Mikrosekunden hat?

Klar. Gibt ne super Auflösung. Von Genauigkeit schrieb er nichts. ;-)

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

Peter II schrieb:
> Wenn es um exakte Zeitenmessungen geht nimmt man unter Windows z.b.
> QueryPerformanceCounter (gibt es auch unter Linux). Dann muss man
> eventuell noch beachtet das bei AMD jeder CPU-Kern seine eigene zeit
> hat. Da kann es schnell mal passieren das man eine negative Differenz
> hat wenn dazwischen ein core-wechsel stattgefunden hat.

Da gibt es noch jede Menge weitere Sachen zu beachten (z.B. 
Taktreduktion zur Stromersparnis oder zur Vermeidung von Überhitzung 
oder dynamische Übertaktung, wenn gerade CPU-Kerne ungenutzt sind), 
weshalb man diese Counter am besten gar nicht nutzt. Für genaue Zeiten 
kann man unter Linux clock_gettime(CLOCK_MONOTONIC,...) verwenden. Unter 
Windows gibt's sicher vergleichbares.

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Peter II schrieb:
>> Wenn es um exakte Zeitenmessungen geht nimmt man unter Windows z.b.
>> QueryPerformanceCounter (gibt es auch unter Linux). Dann muss man
>> eventuell noch beachtet das bei AMD jeder CPU-Kern seine eigene zeit
>> hat. Da kann es schnell mal passieren das man eine negative Differenz
>> hat wenn dazwischen ein core-wechsel stattgefunden hat.
>
> clock_gettime(CLOCK_MONOTONIC,...) verwenden. Unter
> Windows gibt's sicher vergleichbares.

QueryPerformanceCounter  ist das Gegenstück unter Windows. Das ist 
direkt von der CPU kommt wird dort schon der aktuelle Takt 
berücksichtig. Das muss man nicht selber machen.

von Oliver (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> 2. Vor allem würde man dann solche peinlichen Antworten vermeiden, wie
> sie in diesem Thread leider wieder vorkommen.
>
> Seit wann stehen in time_t überhaupt Millisekunden drin?
> In der Regel ist das eben nicht der Fall.

Eben daher kommen meine "peinlichen" Antworten. Die Frage ist sowas von 
weit weg von irgend einem erkennbaren Verständnis des Problems, und 
völlig frei von allen weiteren Hinweisen, was denn überhaupt schon 
vorhanden ist, daß es da nur völlig sinnlose Antworten geben kann.

lmgtfy ist ja leider hier im Forum nicht mehr verwendbar.

Oliver

von Rolf Magnus (Gast)


Lesenswert?

Peter II schrieb:
> QueryPerformanceCounter  ist das Gegenstück unter Windows. Das ist
> direkt von der CPU kommt wird dort schon der aktuelle Takt
> berücksichtig. Das muss man nicht selber machen.

So wie ich das verstehe, ist es von der Rechner-Hardware und der 
Betriebssystemversion abhängig, woher QueryPerformanceCounter seinen 
Wert bekommt. Wenn vorhanden, nutzt es wohl den HPET.
Siehe http://msdn.microsoft.com/en-us/windows/hardware/gg463347.aspx

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Peter II schrieb:
>> QueryPerformanceCounter  ist das Gegenstück unter Windows. Das ist
>> direkt von der CPU kommt wird dort schon der aktuelle Takt
>> berücksichtig. Das muss man nicht selber machen.
>
> So wie ich das verstehe, ist es von der Rechner-Hardware und der
> Betriebssystemversion abhängig, woher QueryPerformanceCounter seinen
> Wert bekommt. Wenn vorhanden, nutzt es wohl den HPET.
> Siehe http://msdn.microsoft.com/en-us/windows/hardware/gg463347.aspx

klar ist es von der Hardware abhängig. Aber Änderung der Taktrate wird 
bei alles quellen berücksichtig. (bestimmt gibt es da auch irgendwelche 
bugs wo es Abweichungen geben kann) aber das wird unter Linux nicht 
anders sein, sie müssen sich auch auf die Hardware verlassen.

von Klaus W. (mfgkw)


Lesenswert?

Oliver schrieb:
> Eben daher kommen meine "peinlichen" Antworten.

Stimmt auch wieder.

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.