我有一个C程序,目的是在几个处理器上并行运行。我需要能够记录执行时间(可以从1秒到几分钟不等)。我已经搜索了答案,但它们似乎都建议使用clock()函数,然后涉及计算程序所用的时钟数除以Clocks_per_second值。

我不确定Clocks_per_second值是如何计算的?

在Java中,我只是在执行前后以毫秒为单位获取当前时间。

C语言中也有类似的东西吗?我看了一下,但我似乎找不到比第二次分辨率更好的方法。

我也知道一个分析器将是一个选项,但我希望自己实现一个定时器。

谢谢


当前回答

CLOCKS_PER_SEC是一个在<time.h>中声明的常量。要获得C应用程序中任务使用的CPU时间,请使用:

clock_t begin = clock();

/* here, do your time-consuming job */

clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

注意,这将以浮点类型返回时间。这可以比一秒更精确(例如,你测量的是4.52秒)。精度取决于架构;在现代系统上,你很容易得到10毫秒或更低,但在老式的Windows机器上(从Win98时代开始),它接近60毫秒。

clock()是标准C;它“无处不在”。有一些系统特定的函数,比如类unix系统上的getrusage()。

Java的System.currentTimeMillis()没有测量相同的东西。它是一个“挂钟”:它可以帮助您测量程序执行所花费的时间,但它不会告诉您使用了多少CPU时间。在多任务系统(即所有系统)上,这些可能有很大的不同。

其他回答

    #include<time.h>
    #include<stdio.h>
    int main(){
      clock_t begin=clock();

      int i;
      for(i=0;i<100000;i++){
        printf("%d",i);
      }
      clock_t end=clock();

      printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
    }

这个程序会很有效。

不是所有的解都在我的系统里起作用。

我可以适应

#include <time.h>

double difftime(time_t time1, time_t time0);

Thomas Pornin的回答是:

#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)

像这样使用它:

TICK(TIME_A);
functionA();
TOCK(TIME_A);

TICK(TIME_B);
functionB();
TOCK(TIME_B);

输出:

time TIME_A: 0.001652 sec.
time TIME_B: 0.004028 sec.

如果你的程序使用GPU或者使用sleep(),那么clock() diff给出的持续时间小于实际持续时间。这是因为clock()返回CPU时钟滴答数。它只能用于计算CPU使用时间(CPU负载),而不能用于计算执行持续时间。我们不应该使用clock()来计算持续时间。在C语言中,我们仍然应该使用gettimeofday()或clock_gettime()来表示持续时间。

ANSI C只指定秒精度时间函数。但是,如果您在POSIX环境中运行,则可以使用gettimeofday()函数,该函数提供自UNIX纪元以来经过的时间的微秒分辨率。

作为旁注,我不建议使用clock(),因为它在许多(如果不是所有?)系统上实现得很糟糕,而且不准确,此外,它只指程序在CPU上花费了多长时间,而不是程序的总生命周期,根据您的问题,我认为您想测量的是总生命周期。