我还是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);
它给了我一个负数,这是怎么回事?
沃尔特
答案 0 :(得分:3)
clock()
返回自程序启动以来经过的时钟周期数。如果你想将时钟返回的值转换为秒除以CLOCKS_PER_SEC
(并且相反地相乘)。
只有一个缺陷,即时钟使用的初始参考时刻,因为程序执行的开始可能因平台而异。要计算程序的实际处理时间,应将时钟返回的值与初始调用时钟返回的值进行比较。
修改强>
larsman非常友好地发表评论中的其他陷阱。我把它们包括在这里供将来参考。在其他几个实现中,clock()
返回的值还包括通过wait(2)
(或其他等待类型调用)收集状态的任何子项的时间。 Linux不包括clock()
返回的值中等待子项的次数。
请注意,时间可以环绕。在CLOCKS_PER_SEC等于1000000的32位系统上[按照POSIX的要求],此函数大约每72分钟返回相同的值。
<强> EDIT2 强>
在这里弄乱了一段时间后,我的便携式(Linux / Windows)会出现问题。但要小心,我对C / C ++没有经验,并且很可能包含有史以来最愚蠢的错误。
#ifdef _WIN32
#include <windows.h>
#define msleep(ms) Sleep((DWORD) ms)
#else
#include <unistd.h>
inline void msleep(unsigned long ms) {
while (ms--) usleep(1000);
}
#endif
答案 1 :(得分:1)
你错过了*(指针), 你的参数是指针(clock_t变量的地址) 所以,您的代码必须修改::
return((double(*end - *start)/CLOCKS_PER_SEC)*1000);
答案 2 :(得分:0)
在Windows下,您可以使用:
VOID WINAPI Sleep(
__in DWORD dwMilliseconds
);
在linux中,您将需要使用:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
注意参数差异 - 在linux下的windows和秒下的毫秒数。
答案 3 :(得分:0)
我的方法依赖于:
int gettimeofday(struct timeval *tv, struct timezone *tz);
给出了自纪元以来的秒数和微秒数。根据 man 页面:
The tv argument is a struct timeval (as specified in <sys/time.h>):
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
所以我们走了:
#include <sys/time.h>
#include <iostream>
#include <iomanip>
static long myclock()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * 1000000) + tv.tv_usec;
}
double getRuntime(long* end, long* start)
{
return (*end - *start);
}
void doWork()
{
sleep(3);
}
int main(void)
{
long start = myclock();
doWork();
long end = myclock();
std::cout << "Time elapsed: " << std::setprecision(6) << getRuntime(&end, &start)/1000.0 << " miliseconds" << std::endl;
std::cout << "Time elapsed: " << std::setprecision(3) << getRuntime(&end, &start)/1000000.0 << " seconds" << std::endl;
return 0;
}
输出:
Time elapsed: 3000.08 miliseconds
Time elapsed: 3 seconds