linux c 程序执行时间间隔,如何在Linux下测量C程序的实际执行时间?

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

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

我怎么知道getrusage()的精度?

是否有其他方法可以提供比getrusage()更高的精度?

在正常的操作系统中,如果没有其他用户程序在运行,则实际执行时间与经过时间之间的差异不重要。通常,实际执行时间与经过时间成正比。

@Andrei:您假设程序不执行任何I / O操作(等待磁盘或网络),并且完全受CPU限制。这仅适用于少数程序。

定义"实际执行时间"。如果不是壁钟,也不是用户+系统时间,那是什么?当您想要更高的精度时,是什么意思,纳秒而不是微秒?注意,纳秒精度可能是虚构的,因为大多数Unix内核都没有提供这种功能。

clock_gettime是否可以满足您的需求?它们为大多数要求提供了几个时钟。您可能需要CLOCK_PROCESS_CPUTIME_ID。

在多CP??U机器上的多线程程序中,一个进程的CPU时间可能比该进程的经过时间长得多(最多高出N倍,其中N是单独的处理器数)。

您可以通过利用内核的CPU时间功能来检查Linux上进程的实际CPU时间:

#include

clock_t start, end;

double cpu_time_used;

start = clock();

... /* Do the work. */

end = clock();

cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

资料来源:http://www.gnu.org/s/hello/manual/libc/CPU-Time.html#CPU-Time

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

看来此方法可以测量两次调用clock()之间的经过时间,即所测量的时间可能包括在其他进程上花费的时间,对吗?

@Dillon Geo:否。这是两次调用之间的调用过程所消耗的CPU时间。

@caf是正确的-引用主CPU时间页面:CPU时间类似于日历时间,只是它基于特定进程正在使用CPU时的时间连续性子集。因此,CPU时间是相对于进程的。如果我的回答有帮助并且是正确的,您能否赞成/接受作为解决方案?谢谢! :)

是cpu_time_used秒的单位?

在64位计算机上,clock()可能是最好的解决方案,因为它可以在可用的最佳系统调用之上实现,尽管这取决于实现。根据Linux Clock(3)手册页:"在glibc 2.17和更早版本中,clock()是在times(2)之上实现的。为了提高精度,由于glibc 2.18,它是在clock_gettime(2)之上实现的(使用CLOCK_PROCESS_CPUTIME_ID时钟)。"

getrusage()函数是我知道的唯一消耗" CPU时间消耗"的标准/便携式方法。

没有简单的方法可以确定返回值的精度。我很想一次调用getrusage()来获取初始值,然后反复调用它,直到返回的值与初始值不同为止,然后假定有效精度是初始值与最终值之间的差值。这是一个hack(精度可能高于此方法确定的水平,并且结果应该被认为是最坏情况的估计),但这总比没有好。

我也会担心返回值的准确性。在某些内核下,我希望当计时器IRQ发生时,无论正在运行的任何代码,计数器都会增加;因此,进程可能会很幸运(并在计时器IRQ发生之前不断阻塞)或非常不幸运(并在计时器IRQ发生之前取消阻塞)。在这种情况下,"幸运"可能意味着CPU消耗看起来好像没有使用任何CPU时间,而"不幸"可能意味着占用了很少CPU时间的进程看起来却变得很像CPU消耗。

对于特定体系结构上特定内核的特定版本(在某些情况下,可能取决于是否使用特定配置选项编译内核时),可能会有一些精度更高的替代品,它们不是可移植的也不是标准的...

您可以使用以下代码:

#include

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

",delta);

它会告诉您代码的执行时间

拒绝投票,因为这是使用gettimeofday()测量挂钟时间的原因。 OP询问CPU时间(即,当进程未执行时,经过的时间计数器应停止。)

@MatthewCole没错。这将计算墙壁时间。谢谢你的反对

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值