C – gettimeofday für Rechenzeit?

Lesezeit: 4 Minuten

Benutzer-Avatar
Wegpunkt

Wissen Sie, wie man gettimeofday zum Messen der Rechenzeit verwendet? Ich kann einmal mit diesem Code messen:

  char buffer[30];
  struct timeval tv;

  time_t curtime;



 gettimeofday(&tv, NULL); 
 curtime=tv.tv_sec;

 strftime(buffer,30,"%m-%d-%Y  %T.",localtime(&curtime));
 printf("%s%ld\n",buffer,tv.tv_usec);

Dieser wird vor dem Rechnen gemacht, der zweite danach. Aber wissen Sie, wie man es subtrahiert?

Ich brauche das Ergebnis in Millisekunden

  • gettimeofday sollte eigentlich nicht verwendet werden, um die verstrichene Zeit zu messen. Verwenden clock_gettime(CLOCK_MONOTONIC) stattdessen. Hier ist der Grund

    – Daniel Kamil Kozar

    1. Oktober 2013 um 7:26 Uhr

  • Was ist ‘ld’ in der printf-Anweisung? und auch warum in irgendeinem Programm ===> printf(“time = %06lu\n”, now.tv_usec); wird genutzt? Was ist 06 in den Anführungszeichen?

    – Anfänger

    6. Dezember 2013 um 6:48 Uhr


  • Eine sehr schöne Seite mit einigen guten Referenzen und manchmal Beispielen, aber es gibt auch andere wie zum Beispiel Wikibooks. techonthenet.com/c_language/standard_library_functions/time_h/…

    – Douglas G. Allen

    28. Mai 2015 um 15:14 Uhr

  • @Beginner …… %ld ist ein Formatbezeichner: für lange Dezimalzahlen und %06lu ist ein Formatbezeichner: für lange ohne Vorzeichen mit 6 führenden Nullen … Sie können sich hier über printf-Formatbezeichner informieren: cplusplus.com/reference/cstdio/printf

    – NeoH4x0r

    15. September 2015 um 14:23 Uhr

So subtrahieren Sie Zeitwerte:

gettimeofday(&t0, 0);
/* ... */
gettimeofday(&t1, 0);
long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;

Dies setzt voraus, dass Sie mit Intervallen arbeiten, die kürzer als ~2000 Sekunden sind. An diesem Punkt kann die Arithmetik je nach verwendeten Typen überlaufen. Wenn Sie mit längeren Intervallen arbeiten müssen, ändern Sie einfach die letzte Zeile in:

long long elapsed = (t1.tv_sec-t0.tv_sec)*1000000LL + t1.tv_usec-t0.tv_usec;

  • funktioniert nicht, ich brauche Millisekunden und es sagt Segmentierungsfehler

    – Wegpunkt

    19. März 2011 um 15:01 Uhr

  • Der Segmentierungsfehler hat nichts mit diesem Code zu tun. Es passiert woanders.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    19. März 2011 um 15:07 Uhr

  • Ich erhalte nur bei Verwendung dieses Codes einen Segmentierungsfehler, trotzdem zählt er nicht in Millisekunden

    – Wegpunkt

    19. März 2011 um 15:09 Uhr

  • Es zählt Mikrosekunden. Teilen Sie durch 1000, wenn Sie Millisekunden benötigen, aber Millisekunden gelten im Allgemeinen als sehr, sehr schlechte Zeitauflösung. Wenn Sie einen Segmentierungsfehler erhalten, müssen Sie Ihren Code anzeigen oder einen Debugger verwenden, um selbst herauszufinden, wo es passiert, aber aufgrund des von mir vorgeschlagenen Codes kann dies definitiv nicht passieren.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    19. März 2011 um 15:59 Uhr

  • @Xofo: Welcher nicht initialisierte Speicher? Ja, gtod ist veraltet, aber die Leute verwenden es immer noch aus vernünftigen Gründen. Verwenden clock_gettime und teilen Sie durch 1000, wenn Sie es vorziehen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    27. Mai 2016 um 16:04 Uhr

Wenn Sie die Code-Effizienz oder auf andere Weise die Zeit messen möchten IntervalleFolgendes wird einfacher:

#include <time.h>

int main()
{
   clock_t start = clock();
   //... do work here
   clock_t end = clock();
   double time_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC;
   return 0;
}

hth

  • Dies misst die CPU-Zeit, nicht Echtzeit, und hat oft eine sehr schlechte Auflösung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    19. März 2011 um 14:19 Uhr

  • Dies ist gut, wenn Sie die CPU-Effizienz messen möchten. Wenn Sie etwas anderes messen – beispielsweise eine E/A-Operation – ist es möglicherweise besser, gettimeofday() zu verwenden.

    – Brian L

    19. März 2011 um 14:20 Uhr

  • Ich frage mich nur, ob er versucht, Benchmark-Tests durchzuführen. Gibt es dafür nicht irgendwo eine C-lib? Aber natürlich bist du in Ordnung. Ich stimme zu, weil ich auch lerne. Bitte Leute, lasst die Überschriften nicht weg. Es ist alles in den Bibliotheken, die wir verwenden, richtig?

    – Douglas G. Allen

    28. Mai 2015 um 20:35 Uhr

Die Antwort von @Daniel Kamil Kozar ist die richtige Antwort – gettimeofday sollte eigentlich nicht verwendet werden, um die verstrichene Zeit zu messen. Verwenden Sie stattdessen clock_gettime(CLOCK_MONOTONIC).


Man Pages sagen – Die von gettimeofday() zurückgegebene Zeit wird durch diskontinuierliche Sprünge in der Systemzeit beeinflusst (z. B. wenn der Systemadministrator die Systemzeit manuell ändert). Wenn Sie eine monoton ansteigende Uhr benötigen, siehe clock_gettime(2).

Die Opengroup sagt – Anwendungen sollten die Funktion clock_gettime() anstelle der veralteten Funktion gettimeofday() verwenden.

Jeder scheint gettimeofday zu lieben, bis er auf einen Fall stößt, wo es nicht funktioniert oder nicht da ist (VxWorks) … clock_gettime ist fantastisch genial und portabel.

<<

Nein. gettimeofday sollte NIEMALS zur Zeitmessung verwendet werden.

Das verursacht überall Bugs. Bitte keine weiteren Bugs hinzufügen.

Dein curtime Die Variable enthält die Anzahl der Sekunden seit der Epoche. Wenn Sie einen davor und einen danach erhalten, ist der spätere minus der frühere die verstrichene Zeit in Sekunden. Sie können abziehen time_t Werte einfach gut.

1383510cookie-checkC – gettimeofday für Rechenzeit?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy