如何测量Linux下C程序的实际执行时间?

如何测量Linux下C程序的实际执行时间?,c,linux,time,C,Linux,Time,我知道这个问题以前可能经常被问到,但似乎大多数问题都是关于一段代码的运行时间(基于挂钟)。一段代码的运行时间不太可能等于实际执行时间,因为其他进程可能在感兴趣代码的运行时间内执行 我使用getrusage()获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间。我正在Ubuntu上运行我的程序。以下是我的问题: 如何知道getrusage()的精度 是否有其他方法可以提供比getrusage()更高的精度 getrusage()函数是我所知道的唯一一种获取“消耗的CPU时

我知道这个问题以前可能经常被问到,但似乎大多数问题都是关于一段代码的运行时间(基于挂钟)。一段代码的运行时间不太可能等于实际执行时间,因为其他进程可能在感兴趣代码的运行时间内执行

我使用getrusage()获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间。我正在Ubuntu上运行我的程序。以下是我的问题:

  • 如何知道getrusage()的精度
  • 是否有其他方法可以提供比getrusage()更高的精度
  • getrusage()函数是我所知道的唯一一种获取“消耗的CPU时间”的标准/可移植方法

    没有简单的方法来确定返回值的精度。我会尝试调用getrusage()一次以获取初始值,并重复调用它,直到返回的值与初始值不同,然后假设有效精度是初始值和最终值之间的差异。这是一个错误(精度可能高于此方法确定的精度,结果可能被视为最坏情况估计),但总比没有好

    我还担心返回值的准确性。在某些内核下,我希望当计时器IRQ出现时,计数器会对运行的任何代码递增;因此,一个进程可能非常幸运(并且在计时器IRQ发生之前持续阻塞)或者非常不幸运(并且在计时器IRQ发生之前解除阻塞)。在这种情况下,“幸运”可能意味着CPU占用者看起来像是不占用CPU时间,而“不幸运”可能意味着占用很少CPU时间的进程看起来像是CPU占用者


    对于特定体系结构上特定内核的特定版本(可能取决于在某些情况下是否/何时使用特定配置选项编译内核),可能有不可移植且不标准的更高精度的替代方案…

    您可以利用内核的功能在linux上检查进程的实时CPU时间:

     #include <time.h>
    
     clock_t start, end;
     double cpu_time_used;
    
     start = clock();
     ... /* Do the work. */
     end = clock();
     cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    
    #包括
    时钟开始、结束;
    使用双cpu时间;
    开始=时钟();
    ... /* 做这项工作*/
    结束=时钟();
    使用的cpu时间=((双精度)(结束-开始))/每秒时钟数;
    
    资料来源:


    这样,您可以计算CPU滴答声或CPU在进程中处理的指令的实际数量,从而获得实际的工作时间。

    您可以使用以下代码:

    #include <sys/time.h>
    struct timeval start, end;
    gettimeofday(&start, NULL);
    .
    .
    .
    gettimeofday(&end, NULL);
    delta = ((end.tv_sec  - start.tv_sec) * 1000000u +
             end.tv_usec - start.tv_usec) / 1.e6;
    printf("Time is : %f\n",delta);
    
    #包括
    结构timeval开始、结束;
    gettimeofday(&start,NULL);
    .
    .
    .
    gettimeofday(&end,NULL);
    增量=((end.tv_秒-start.tv_秒)*1000000秒+
    end.tv_usec-start.tv_usec)/1.e6;
    printf(“时间为:%f\n”,增量);
    

    它将显示一段代码在正常操作系统中的执行时间

    ,如果没有其他用户程序运行,实际执行时间和运行时间之间的差异应该不重要。通常,实际执行时间与运行时间成正比。@Andrei:您假设程序不执行任何I/O操作(等待磁盘或网络),完全受CPU限制。这只适用于少数程序。定义“实际执行时间”。如果不是挂钟,也不是用户+系统时间,那么它是什么?当你想要更高的精度时,你是什么意思,纳秒而不是微秒?请注意,纳秒精度可能是虚构的,因为时钟时间能满足您的需要吗?它们提供多个时钟以满足大多数要求。CLOCK_PROCESS_CPUTIME_ID可能就是您所需要的。在多CPU机器上的多线程程序中,进程的CPU时间可能比进程的运行时间高得多(高出N倍,其中N是独立处理器的数量)。此方法似乎可以测量对CLOCK()的两次调用之间的运行时间,即,测量的时间可能包括花费在其他进程上的时间,对吗?@Dillon Geo:No.这是调用进程在两次调用之间消耗的CPU时间。@caf是正确的-引用-Page:CPU时间类似于日历时间,只是它基于特定进程正在使用CPU时的时间连续体子集。因此,CPU时间是相对于进程的。如果我的回答有帮助并且是正确的,你能投票/接受作为解决方案吗?谢谢!:)在64位机器上,
    clock()
    可能是最好的解决方案,因为它可以在可用的最佳系统调用之上实现,尽管这取决于实现。根据LinuxClock(3)手册页:“在Glibc2.17和更早版本中,clock()是在times(2)之上实现的。为了提高精度,自Glibc2.18以来,它是在clock_gettime(2)之上实现的(使用clock_进程_CPUTIME_ID clock)。”投票被否决,因为这是使用
    gettimeofday()
    来测量墙上的时钟时间。OP询问CPU时间(即当进程未执行时,运行时间计数器应停止。)@MatthewCole这是真的。这将计算墙时间。谢谢你的否决票