如何获得C程序的执行时间?

时间:2019-03-25 19:09:26

标签: c time execution

我正在为我的c程序使用时钟功能来打印当前程序的执行时间。我在输出中得到的时间是错误的。我想以秒,毫秒和微秒为单位显示时间。

#include <stdio.h> 
#include <unistd.h>
#include <time.h> 
int main() 
{ 
    clock_t start = clock(); 
    sleep(3);
    clock_t end = clock(); 
    double time_taken = (double)(end - start)/CLOCKS_PER_SEC; // in seconds 

    printf("time program took %f seconds to execute \n", time_taken); 
    return 0; 
} 


time ./time
time program took 0.081000 seconds to execute
real    0m3.002s
user    0m0.000s
sys     0m0.002s

我希望输出大约3秒钟,但是显示错误。 如您所见如果我使用Linux命令时间运行该程序,我得到的时间是正确的,我想使用我的c程序显示相同的时间。

1 个答案:

答案 0 :(得分:3)

与流行的看法相反,clock()函数检索CPU时间,而不是经过的时钟时间,因为名称混乱可能会使人们相信。

这是C标准中的语言:

  

7.27.2.1 clock函数

     

简介

#include <time.h>
clock_t clock(void);
     

说明

     

clock函数确定使用的处理器时间。

     

返回

     

clock函数返回自实现所定义的仅与程序调用相关的时代开始以来,实现对程序所用处理器时间的最佳近似值。要确定以秒为单位的时间,应将时钟函数返回的值除以宏CLOCKS_PER_SEC的值。如果没有可用的处理器时间,则该函数返回值(clock_t)(−1)。如果无法表示该值,则该函数返回未指定的值。

要获取经过的时间,应使用以下之一:

  • time()函数,分辨率为1秒
  • timespec_get()函数可能更精确,但可能并非在所有系统上都可用
  • 在Linux系统上可用的gettimeofday()系统调用
  • clock_gettime()函数。

有关此主题的更多信息,请参见What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX?

以下是使用gettimeoday()的修改版本:

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

int main() {
    struct timeval start, end;

    gettimeofday(&start, NULL);
    sleep(3);
    gettimeofday(&end, NULL);

    double time_taken = end.tv_sec + end.tv_usec / 1e6 -
                        start.tv_sec - start.tv_usec / 1e6; // in seconds

    printf("time program took %f seconds to execute\n", time_taken);
    return 0;
}

输出:

time program took 3.005133 seconds to execute