GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Messen der verstrichenen Zeit in Linux für ein C-Programm

Drei Alternativen

  1. clock()
  2. gettimeofday()
  3. clock_gettime()

clock_gettime() geht bis zu einer Genauigkeit von Nanosekunden und unterstützt 4 Uhren.

  • CLOCK_REALTIME

    Systemweite Echtzeituhr. Zum Einstellen dieser Uhr sind entsprechende Berechtigungen erforderlich.

  • CLOCK_MONOTONIC

    Uhr, die nicht eingestellt werden kann und seit einem unbestimmten Startpunkt eine monotone Zeit darstellt.

  • CLOCK_PROCESS_CPUTIME_ID

    Hochauflösender Pro-Prozess-Timer von der CPU.

  • CLOCK_THREAD_CPUTIME_ID

    Thread-spezifische CPU-Zeituhr.

Sie können es verwenden als

#include <time.h>

struct timespec start, stop;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

/// do something

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);

double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3;    // in microseconds

Hinweis:Die Funktion clock() gibt die CPU-Zeit für Ihren Prozess zurück, nicht die Uhrzeit der Wanduhr. Ich glaube, das OP war daran interessiert. Wenn die Uhrzeit der Wanduhr gewünscht wird, ist gettimeofday() eine gute Wahl, wie in einer früheren Antwort vorgeschlagen. clock_gettime() kann beides tun, wenn Ihr System dies unterstützt; Auf meinem eingebetteten Linux-System wird clock_gettime() nicht unterstützt, aber clock() und gettimeofday() werden unterstützt.

Unten ist der Code zum Abrufen der Wanduhrzeit mit gettimeofday()

#include <stdio.h> // for printf()
#include <sys/time.h> // for clock_gettime()
#include <unistd.h> // for usleep()

int main() {
    struct timeval start, end;
    long secs_used,micros_used;

    gettimeofday(&start, NULL);
    usleep(1250000); // Do the stuff you want to time here
    gettimeofday(&end, NULL);

    printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
    printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);

    secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
    micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);

    printf("micros_used: %d\n",micros_used);
    return 0;
}

Zu Beginn müssen Sie Gleitkommaarithmetik verwenden. Jeder ganzzahlige Wert dividiert durch einen größeren ganzzahligen Wert ist immer Null.

Und das sollten Sie natürlich tun etwas zwischen Start- und Endzeit.

Übrigens, wenn Sie Zugriff auf gettimeofday haben es wird normalerweise gegenüber clock bevorzugt da es eine höhere Auflösung hat. Oder vielleicht clock_gettime die eine noch höhere Auflösung hat.


Linux
  1. Linux – Werkzeug zur Messung der Entropiequalität?

  2. Wie lade ich ein Programm für einen schnelleren Start vor?

  3. 7 Beispiele für hwclock-Befehle unter Linux zum Einstellen von Datum und Uhrzeit der Hardwareuhr

  4. Formatieren Sie Datum und Uhrzeit für Linux-Shell-Skript oder -Variable

  5. Zeit in Linux messen - Zeit vs. Uhr vs. getrusage vs. clock_gettime vs. gettimeofday vs. timespec_get?

Linux-Zeitbefehl

Cronopete – Ein Time Machine Clone von Apple für Linux

So führen Sie einen Befehl für eine bestimmte Zeit in Linux aus

Top 5 Zeiterfassungssoftware für Linux

Kurzanleitung zu Ansible für Linux-Systemadministratoren

Die 20 besten Zeiterfassungssoftware für Linux-Desktop