Namensräume
Varianten
Aktionen

clock

Von cppreference.com
< c‎ | chrono
Definiert in Header <time.h>
clock_t clock(void);

Gibt die ungefähr benötigte Prozessorzeit für den Prozess seit Beginn einer implementierungsdefinierten Ära zurück, die mit der Ausführung des Programms zusammenhängt. Um den Rückgabewert in Sekunden umzurechnen, dividieren Sie ihn durch CLOCKS_PER_SEC.

Nur die Differenz zwischen zwei verschiedenen Aufrufen von clock ist aussagekräftig, da der Beginn der clock-Ära nicht mit dem Start des Programms übereinstimmen muss.

Die clock-Zeit kann schneller oder langsamer als die Wanduhr vergehen, abhängig von den vom Betriebssystem dem Programm zugewiesenen Ausführungsressourcen. Wenn die CPU beispielsweise von anderen Prozessen geteilt wird, kann die clock-Zeit langsamer als die Wanduhr vergehen. Wenn der aktuelle Prozess andererseits multithreaded ist und mehr als ein Ausführungskern verfügbar ist, kann die clock-Zeit schneller als die Wanduhr vergehen.

Inhalt

[bearbeiten] Rückgabewert

Bisher vom Programm verwendete Prozessorzeit.

  • Wenn die verwendete Prozessorzeit nicht verfügbar ist, wird (clock_t)(-1) zurückgegeben.
  • Wenn der Wert der verwendeten Prozessorzeit nicht durch clock_t dargestellt werden kann, wird ein undefinierter Wert zurückgegeben.

[bearbeiten] Hinweise

Auf POSIX-kompatiblen Systemen bietet clock_gettime mit der Clock-ID CLOCK_PROCESS_CPUTIME_ID eine bessere Auflösung.

Der von clock() zurückgegebene Wert kann bei einigen Implementierungen einen Überlauf verursachen. Wenn beispielsweise bei einer solchen Implementierung clock_t ein vorzeichenbehafteter 32-Bit-Integer ist und CLOCKS_PER_SEC 1000000 ist, tritt nach etwa 2147 Sekunden (etwa 36 Minuten) ein Überlauf auf.

[bearbeiten] Beispiel

Dieses Beispiel demonstriert den Unterschied zwischen der clock()-Zeit und der Echtzeit.

#ifndef __STDC_NO_THREADS__
    #include <threads.h>
#else
    // POSIX alternative
    #define _POSIX_C_SOURCE 199309L
    #include <pthread.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// the function f() does some time-consuming work
int f(void* thr_data) // return void* in POSIX
{
    (void) thr_data;
    volatile double d = 0;
    for (int n = 0; n < 10000; ++n)
       for (int m = 0; m < 10000; ++m)
           d += d * n * m;
    return 0;
}
 
int main(void)
{
    struct timespec ts1, tw1; // both C11 and POSIX
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1); // POSIX
    clock_gettime(CLOCK_MONOTONIC, &tw1); // POSIX; use timespec_get in C11
    clock_t t1 = clock();
 
#ifndef __STDC_NO_THREADS__
    thrd_t thr1, thr2;  // C11; use pthread_t in POSIX
    thrd_create(&thr1, f, NULL); // C11; use pthread_create in POSIX
    thrd_create(&thr2, f, NULL);
    thrd_join(thr1, NULL); // C11; use pthread_join in POSIX
    thrd_join(thr2, NULL);
#endif
 
    struct timespec ts2, tw2;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts2);
    clock_gettime(CLOCK_MONOTONIC, &tw2);
    clock_t t2 = clock();
 
    double dur = 1000.0 * (t2 - t1) / CLOCKS_PER_SEC;
    double posix_dur = 1000.0 * ts2.tv_sec + 1e-6 * ts2.tv_nsec
                           - (1000.0 * ts1.tv_sec + 1e-6 * ts1.tv_nsec);
    double posix_wall = 1000.0 * tw2.tv_sec + 1e-6 * tw2.tv_nsec
                            - (1000.0 * tw1.tv_sec + 1e-6 * tw1.tv_nsec);
 
    printf("CPU time used (per clock()): %.2f ms\n", dur);
    printf("CPU time used (per clock_gettime()): %.2f ms\n", posix_dur);
    printf("Wall time passed: %.2f ms\n", posix_wall);
}

Mögliche Ausgabe

CPU time used (per clock()): 1580.00 ms
CPU time used (per clock_gettime()): 1582.76 ms
Wall time passed: 792.13 ms

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.27.2.1 Die Funktion clock (S. 285)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.27.2.1 Die Funktion clock (S. 389)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.23.2.1 Die Funktion clock (S. 339)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.12.2.1 Die Funktion clock

[bearbeiten] Siehe auch

(in C23 veraltet)(C11)
konvertiert ein time_t-Objekt in eine Textdarstellung
(Funktion) [bearbeiten]
gibt die aktuelle Kalenderzeit des Systems als Zeit seit der Epoche zurück
(Funktion) [bearbeiten]