使用clock()函数来计算程序执行时间

6

我正在使用类似以下的方式来计算程序从开始到结束所需的时间:

int main(){
    clock_t startClock = clock();
    .... // many codes
    clock_t endClock = clock();
    printf("%ld", (endClock - startClock) / CLOCKS_PER_SEC);
}

我的问题是,由于同时有多个进程运行,如果我的进程在空闲状态下运行x时间,那么在这段时间内时钟会在我的程序中继续滴答吗?

所以,我的担忧是,假设已经过去了1000个时钟周期,但我的进程只使用了其中的500个,那么我从(endClock - startClock)中会得到500还是1000?

谢谢。


1
你是想测量CPU时间还是墙钟时间? - NPE
我想比较不同实现的性能,所以我认为 CPU 时间会更合适。有什么建议吗? - Derek Li
你使用的是Linux还是Windows?或者其他操作系统? - Mysticial
由于您正在使用Linux,clock()将为您提供CPU时间。如果您的应用程序仅为单线程,则这是衡量性能的好方法(前提是您没有其他进程通过缓存或超线程干扰...)。但是,如果它是多线程的,则使用挂钟将提供更有意义的性能结果。 - Mysticial
我实际上正在尝试比较不同实现(使用16/32/64等线程)之间的性能。我可以在创建线程之前执行startClock=clock(),并在join之后执行endClock=clock()吗?如果是多线程代码,为什么墙钟会给出更有意义的性能呢?谢谢。 - Derek Li
那么您将需要使用挂钟。在多线程应用程序中测量CPU时间并不是非常有意义的,因为可能存在负载不平衡和空闲线程。为此,您需要使用gettimeofday()。请参见我发布的答案。 - Mysticial
3个回答

11
这取决于操作系统。在Windows上,clock()测量的是墙时。在Linux / Posix上,它测量所有线程的组合CPU时间。
如果您想要Linux上的墙时,请使用gettimeofday()
如果您想要Windows上的CPU时间,请使用GetProcessTimes()
编辑:
因此,如果您在Windows上,clock()将会测量空闲时间。
在Linux上,clock()不会测量空闲时间。

无论哪种情况,我都不会使用它;它的分辨率非常低。请看我的回答。 - R.. GitHub STOP HELPING ICE
确实如此,但是根据评论来看,该程序是多线程的,因此我不确定原帖作者是否想使用 CPU 时间来衡量性能。 - Mysticial

2

clock在POSIX上测量CPU时间,但通常分辨率非常低。相反,现代程序应该使用clock_gettimeCLOCK_PROCESS_CPUTIME_ID时钟ID。这将提供高达纳秒级分辨率的结果,通常实际上就是如此好。


个人经验可能有所不同。我在工作中使用的AIX系统上发现,clock_gettime的分辨率甚至比clock还要差。clock的分辨率大约为3毫秒,而clock_getres报告的分辨率为10毫秒。 - Fred Larson

1
根据Linux手册中的定义,clock()函数返回程序使用的处理器时间的近似值。它会尽可能地准确,但正如您所说,一些时间(例如进程切换)很难归因于一个进程,因此这些数字将尽可能准确,但并非完美。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接