我有一个C程序,旨在在几个处理器上并行运行 . 我需要能够记录执行时间(可能是从1秒到几分钟的任何时间) . 我已经搜索了答案,但他们似乎都建议使用 clock()
函数,然后计算程序所用的时钟数除以 Clocks_per_second
值 .
我不确定如何计算 Clocks_per_second
值?
在Java中,我只是在执行之前和之后以毫秒为单位 .
C中有类似的东西吗?我看过了,但我似乎无法找到比第二种解决方案更好的方法 .
我也知道分析器是一个选项,但我希望自己实现一个计时器 .
谢谢
13 回答
在普通香草C:
每个解决方案都不适用于我的系统 .
我可以使用
ANSI C仅指定第二个精确时间函数 . 但是,如果您在POSIX环境中运行,则可以使用gettimeofday()函数,该函数提供自UNIX Epoch以来经过的微秒分辨率 .
作为旁注,我不推荐使用clock(),因为它在很多(如果不是全部?)系统上实现得很糟糕而且不准确,除了它只是指你的程序花了多长时间在CPU和不是程序的总寿命,根据你的问题,我认为你想测量 .
很多答案一直在建议
clock()
,然后CLOCKS_PER_SEC
来自time.h
. 这可能是一个坏主意,因为这是我的/bits/time.h
文件所说的:因此
CLOCKS_PER_SEC
可能被定义为1000000,具体取决于您用于编译的选项,因此它似乎不是一个好的解决方案 .CLOCKS_PER_SEC
是一个在<time.h>
中声明的常量 . 要获取C应用程序中任务使用的CPU时间,请使用:请注意,这会将时间作为浮点类型返回 . 这可能比一秒钟更精确(例如,您测量4.52秒) . 精度取决于架构;在现代系统上你很容易获得10毫秒或更低,但在较旧的Windows机器上(从Win98时代)它接近60毫秒 .
clock()
是标准C;它有效"everywhere" . 有类似系统的功能,例如类Unix系统上的getrusage()
.Java的
System.currentTimeMillis()
并没有衡量同样的事情 . 它是"wall clock":它可以帮助您测量程序执行所花费的时间,但它并不能告诉您使用了多少CPU时间 . 在多任务系统(即所有这些系统)上,这些可以是广泛不同的 .(如果您的系统管理员更改了系统时间,或者您的时区有不同的冬季和夏季时间,那么这里的所有答案都缺乏 . 因此...)
在Linux上使用:
clock_gettime(CLOCK_MONOTONIC_RAW, &time_variable);
如果系统管理员改变时间,或者你生活在一个冬季时间与夏季时间不同的国家,它不受影响等 .man clock_gettime
州:如果您使用Unix shell运行,则可以使用time命令 .
干
假设a.out,因为可执行文件将给你运行它的时间
冒泡排序和选择排序的执行时间的比较我有一个程序,它比较冒泡排序和选择排序的执行时间 . 要找出执行代码块的时间,请计算块之前和之后的时间
示例代码:
Thomas Pornin作为宏的答案:
像这样用它:
输出:
大多数简单程序的计算时间以毫秒为单位 . 所以,我想,你会发现这很有用 .
如果你想计算整个程序的运行时并且你在Unix系统上,使用time命令运行你的程序,如
time ./a.out
你在功能上想要这个:
请注意,这以微秒为单位,而不仅仅是秒 .
您必须考虑到,测量执行程序的 time 在很大程度上取决于机器在该特定时刻的负载 .
知道了,在C中获取当前时间的方式可以通过不同方式实现,更简单的方法是:
希望能帮助到你 .
问候!