linux系統時間程式設計(9) 計算程式片段執行時間clock函式

奇妙之二進位制發表於2021-01-02
 <time.h>
clock_t clock(void);

clock返回自程式執行以來,所耗費的處理器時間。它的單位並非秒,除以 CLOCKS_PER_SEC 才是秒。

#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec* tp);
int clock_settime(clockid_t clock_id, const struct timespec *tp);

可以根據需要,獲取不同要求的精確時間

引數

  • clk_id : 檢索和設定的clk_id指定的時鐘時間。
    • CLOCK_REALTIME:系統實時時間,隨系統實時時間改變而改變,即從UTC1970-1-1 0:0:0開始計時,
      中間時刻如果系統時間被使用者改成其他,則對應的時間相應改變
    • CLOCK_MONOTONIC:從系統啟動這一刻起開始計時,不受系統時間被使用者改變的影
    • CLOCK_PROCESS_CPUTIME_ID:本程式到當前程式碼系統CPU花費的時間
    • CLOCK_THREAD_CPUTIME_ID:本執行緒到當前程式碼系統CPU花費的時間
struct timespec
{
       time_t tv_sec; /* 秒*/
       long tv_nsec; /* 納秒*/
};
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <threads.h> // pthread.h in POSIX
 
// the function f() does some time-consuming work
int f(void* thr_data) // return void* in POSIX
{
    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();
 
    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);
 
    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);
}

Possible output:

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

相關文章