我还是C的新手,是时钟函数绝对的(意味着它计算你睡了多长时间),还是应用程序实际执行的时间是多少?
我想要一种可靠的方法来产生1秒的精确间隔 . 我正在保存文件,所以我需要考虑到这一点 . 我以毫秒为单位返回运行时间,然后休眠 .
有更准确或更简单的方法吗?
编辑:我遇到的主要问题是我得到一个负数:
double FCamera::getRuntime(clock_t* end, clock_t* start)
{
return((double(end - start)/CLOCKS_PER_SEC)*1000);
}
clock_t start = clock();
doWork();
clock_t end = clock();
double runtimeInMilliseconds = getRuntime(&end, &start);
它给了我一个负数,这是怎么回事?
沃尔特
4 回答
clock()返回自程序启动以来经过的时钟周期数 . 如果你想将时钟返回的值转换为秒除以
CLOCKS_PER_SEC
(并相反地相乘) .只有一个缺陷,即时钟使用的初始参考时刻,因为程序执行的开始可能因平台而异 . 要计算程序的实际处理时间,应将时钟返回的值与初始调用clock返回的值进行比较 .
EDIT
拉斯曼非常善意在评论中发表其他陷阱 . 我把它们包括在这里供将来参考 .
在其他几个实现中,
clock()
返回的值还包括通过wait(2)
(或其他等待类型调用)收集状态的任何子节点的时间 . Linux不包括clock()
返回的值中等待子项的次数 .注意时间可以环绕 . 在CLOCKS_PER_SEC等于1000000的32位系统上[按POSIX的要求],此函数大约每72分钟返回相同的值 .
EDIT2
在这里搞砸了一段时间后,我的便携式(Linux / Windows)会出现问题 . 但要小心,我对C / C没有经验,并且很可能包含有史以来最愚蠢的错误 .
你错过了*(指针),你的参数是指针(clock_t变量的地址)所以,你的代码必须修改::
在Windows下,您可以使用:
在linux中,您将要使用:
注意参数差异 - 在linux下的windows和秒下的毫秒数 .
我的方法依赖于:
int gettimeofday(struct timeval *tv, struct timezone *tz);
它给出了自大纪元以来的秒数和微秒数 . 根据手册页:
所以我们走了:
输出: