猿问
下载APP

C程序的执行时间

C程序的执行时间

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

我不确定如何Clocks_per_second计算价值?

在Java中,我只是在执行之前和之后以毫秒为单位。

C中有类似的东西吗?我看过了,但我似乎无法找到比第二种解决方案更好的方法。

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

谢谢


慕容4345310
浏览 44回答 3
3回答

喵喔喔

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; 它“无处不在”。有系统特定的功能,例如getrusage()类Unix系统。Java System.currentTimeMillis()并没有衡量同样的事情。它是一个“挂钟”:它可以帮助您测量程序执行所花费的时间,但它并不能告诉您使用了多少CPU时间。在多任务系统(即所有这些系统)上,这些系统可能大不相同。

慕婉清6462132

我发现通常的clock(),每个人都推荐这里,出于某种原因,从运行到运行都有很大的偏差,即使对于没有任何副作用的静态代码,比如绘制到屏幕或读取文件。这可能是因为CPU改变了功耗模式,OS给出了不同的优先级等等......因此,每次使用clock()可靠地获得相同结果的唯一方法是在循环中多次运行测量代码(几分钟),采取预防措施以防止编译器优化它:现代编译器可以预先计算代码没有在循环中运行的副作用,并将其移出循环。就像使用每次迭代的随机输入一样。在将足够的样本收集到数组中之后,对该数组进行排序,并获取称为中位数的中间元素。中位数比平均值更好,因为它会抛弃极端偏差,例如说防病毒占用所有CPU或操作系统进行一些更新。这是一个简单的实用程序来测量C / C ++代码的执行性能,平均值接近中位数:https://github.com/saniv/gauge我自己仍然在寻找一种更强大,更快速的方法来衡量代码。人们可能会尝试在没有任何操作系统的裸机上以受控条件运行代码,但这会产生不切实际的结果,因为实际上操作系统确实会涉及到。x86具有这些硬件性能计数器,其中包括执行的实际指令数,但是在没有OS帮助的情况下访问它们很难,很难解释并且有自己的问题(http://archive.gamedev.net/archive/reference/articles /article213.html)。他们仍然可以帮助调查瓶颈的性质(数据访问或对该数据的实际计算)。

慕森王

有些人可能会发现另一种有用的输入:我使用这种测量时间的方法作为使用NVidia CUDA进行GPGPU编程的大学课程的一部分(课程描述)。它结合了早期帖子中看到的方法,我只是发布它,因为要求赋予它可信度:unsigned long int elapsed;struct timeval t_start, t_end, t_diff;gettimeofday(&t_start, NULL);// perform computations ...gettimeofday(&t_end, NULL);timeval_subtract(&t_diff, &t_end, &t_start);elapsed = (t_diff.tv_sec*1e6 + t_diff.tv_usec);printf("GPU version runs in: %lu microsecs\n", elapsed);我想你可以乘以eg,1.0 / 1000.0以获得适合你需要的测量单位。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答