簡體   English   中英

用C測量時間

[英]Measuring time in C

我正在嘗試用C(矩陣乘法)測量一些活動,並注意到我應該做這樣的事情:

clock_t start = clock();
sleep(3);
clock_t end = clock();
double elapsed_time = (end - start)/(double)CLOCKS_PER_SEC;
printf("Elapsed time: %.2f.\n", elapsed_time);

輸出是:

Elapsed time: 0.00.

為什么會這樣?

clock估計程序使用的CPU時間; 這是CPU忙於執行屬於您的程序的指令的時間。 sleep不執行任何工作,因此它不會占用明顯的CPU時間(即使它需要掛鍾時間)。

如果要測量掛鍾時間,請使用time

time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));

將打印一個接近三個的數字。

作為旁注,如果您想以更精確的方式(毫秒)測量執行時間,則time不夠精確。 您可以使用gettimeofday代替:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

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

    gettimeofday(&timecheck, NULL);
    start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    usleep(200000);  // 200ms

    gettimeofday(&timecheck, NULL);
    end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    printf("%ld milliseconds elapsed\n", (end - start));

    return 0;
}

你必須使用time_t start = time(NULL); time_t end = time(NULL); 獲得正確的值。

如果您不關心與Windows綁定,您可以嘗試高分辨率計時器。 它比time()精確得多,它只有一秒的精度,因為它使用的是UNIX格式。

#include <iostream>
#include <windows.h>

__int64 countspersec = 0;
double secpercount = 0.0;
__int64 starttime = 0;
__int64 curtime = 0;

int main() {

    // Get current time, and determine how fast the clock ticks
    QueryPerformanceCounter((LARGE_INTEGER*)&starttime);
    QueryPerformanceFrequency((LARGE_INTEGER*)&countspersec);
    secpercount = 1.0/(double)countspersec;

    /* calculate something */

    // Standard end-start stuff, account for clock speed
    QueryPerformanceCounter((LARGE_INTEGER*)&curtime);
    std::cout << "Time needed: " << (curtime-starttime)*secpercount << " sec\n";
    return 0;
}

使用Orwells中描述的QueryPerformanceFrequency()或使用GetSystemTimeAsFileTime()函數。 后者具有100 ns的粒度,但不會以該速率遞增。 它的增量取決於硬件的底層和多媒體定時器分辨率的設置。 請記住, QueryPerformanceFrequency()返回的頻率被視為常量。 但是,由於它是由硬件生成的,因此它具有偏移和時間漂移。 使用QueryPerformanceCounter()測量時間段通常會伴隨每秒許多微秒的錯誤。 我已經給出了關於類似問題的這個這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM