如何测量C中的时间?

时间:2010-08-24 13:59:17

标签: c windows winapi time

我想知道一些代码块执行的时间(大约)。像这样:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

如何?

7 个答案:

答案 0 :(得分:59)

您可以使用time.h

中的clock方法

示例:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;

答案 1 :(得分:17)

您可以使用time.h库,特别是timedifftime函数:

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t start,end;
  double dif;

  time (&start);
  // Do some calculation.
  time (&end);
  dif = difftime (end,start);
  printf ("Your calculations took %.2lf seconds to run.\n", dif );

  return 0;
}

(示例改编自上面链接的difftime网页。)

请注意,此方法只能提供几秒钟的精确度 - time_t记录自UNIX epoch(1970年1月1日)以来的秒数。

答案 2 :(得分:2)

的GetTickCount()。

#include <windows.h>
void MeasureIt()
{
    DWORD dwStartTime = GetTickCount();
    DWORD dwElapsed;

    DoSomethingThatYouWantToTime();

    dwElapsed = GetTickCount() - dwStartTime;

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}

答案 3 :(得分:1)

我会使用Windows API的QueryPerformanceCounterQueryPerformanceFrequency函数。在块之前和之后调用前者并减去(当前 - 旧)以获得实例之间的“滴答”数。将其除以后一个函数获得的值,以秒为单位得到持续时间。

答案 4 :(得分:0)

如果您不需要出色的分辨率,可以使用GetTickCount():http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (如果它是用于你自己的简单诊断之外的其他东西,那么请注意这个数字可以包围,所以你需要通过一点算术处理它。)

QueryPerformanceCounter是另一个合理的选择。 (它也在MSDN上描述)

答案 5 :(得分:0)

有时需要测量天文时间而不是 CPU时间(尤其适用于 Linux ):

#include <time.h>

double what_time_is_it()
{
    struct timespec now;
    clock_gettime(CLOCK_REALTIME, &now);
    return now.tv_sec + now.tv_nsec*1e-9;
}

int main() {
    double time = what_time_is_it();
    printf("time taken %.6lf\n", what_time_is_it() - time);
    return 0;
}

答案 6 :(得分:0)

标准C库提供了time函数,如果您只需要比较秒,它就很有用。但是,如果需要毫秒级的精度,则最可移植的方法是调用timespec_get。如果系统支持的话,它可以告诉时间高达纳秒的精度。但是,调用它需要花费更多的精力,因为它涉及结构。这是一个仅将结构转换为简单的64位整数的函数。

#include <stdio.h>
#include <inttypes.h>
#include <time.h>

int64_t millis()
{
    struct timespec now;
    timespec_get(&now, TIME_UTC);
    return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}

int main(void)
{
    printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}

clock不同,此函数返回Unix时间戳,因此它将正确考虑阻塞函数(例如sleep)所花费的时间。这对于基准测试和实施考虑到运行时间的延迟很有用。