为什么我的c++;基于clock()的函数是否返回负值? 我仍然是C++的新的,时钟函数是绝对的(意味着计算你睡多长时间),或者是应用程序实际执行了多少时间?< /P>
我想要一种可靠的方法来产生精确的1秒间隔。我正在保存文件,所以我需要对此进行说明。我以毫秒为单位返回运行时,然后为剩余时间休眠 有没有更准确或更简单的方法 编辑: 我遇到的主要问题是我得到了一个负数:为什么我的c++;基于clock()的函数是否返回负值? 我仍然是C++的新的,时钟函数是绝对的(意味着计算你睡多长时间),或者是应用程序实际执行了多少时间?< /P>,c++,timing,clock,C++,Timing,Clock,我想要一种可靠的方法来产生精确的1秒间隔。我正在保存文件,所以我需要对此进行说明。我以毫秒为单位返回运行时,然后为剩余时间休眠 有没有更准确或更简单的方法 编辑: 我遇到的主要问题是我得到了一个负数: double FCamera::getRuntime(clock_t* end, clock_t* start) { return((double(end - start)/CLOCKS_PER_SEC)*1000); } clock_t start = clock(); doWork
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);
它给了我一个负数,怎么了
Walter返回自程序启动以来经过的时钟滴答数。如果要将时钟返回的值转换为秒,请除以CLOCKS\u PER\u SEC
(另一种方法是相乘)
这里只有一个陷阱,时钟用作程序执行开始的初始参考时刻在不同平台之间可能有所不同。要计算程序的实际处理时间,应将时钟返回的值与对时钟的初始调用返回的值进行比较
编辑
拉斯曼在评论中还提到了其他的陷阱,这真是太好了。我把它们放在这里以备将来参考
clock()
返回的值还包括通过wait(2)
(或另一个等待类型调用)收集其状态的任何子级的时间。Linux在clock()
返回的值中不包含等待子项的时间#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
\ifdef\u WIN32
#包括
#定义msleep(毫秒)睡眠((DWORD)毫秒)
#否则
#包括
内联无效msleep(无符号长ms){
而(ms--)usleep(1000);
}
#恩迪夫
在windows下,您可以使用:
VOID WINAPI Sleep(
__in DWORD dwMilliseconds
);
在linux中,您需要使用:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
#包括
无符号整数睡眠(无符号整数秒);
请注意参数差异—windows下的毫秒和linux下的秒。我的方法依赖于:
int gettimeofday(struct timeval*tv,struct timezone*tz)代码>
它给出了自历元以来的秒数和微秒数。根据手册页:
你错过了*(指针),
您的参数是指针(时钟变量的地址)
因此,必须修改您的代码::
return((double(*end - *start)/CLOCKS_PER_SEC)*1000);
关于clock
函数,您是对的,但是您的代码实现延迟的效率相当低——它什么都不做,浪费了CPU周期。为什么不使用内置的sleep
调用呢?还有一个陷阱:“在其他几种实现中,clock()
返回的值还包括通过wait(2)
(或另一种等待类型调用)收集其状态的任何子级的时间.Linux在clock()
”返回的值中不包括等待子项的时间,还有一个:“请注意,时间可以循环。在32位系统上,CLOCKS\u PER\u SEC
等于1000000[按照POSIX的规定],此函数将大约每72分钟返回相同的值。”但由于您的进程会休眠一秒钟,这不太可能成为问题:)他不能使用睡眠,因为他需要在开始写入文件之前启动计时器。所以我会使用clock();或者timeGetTime()(这是一个Windows函数,启动后会有毫秒,每49天包装一次)这个差异被称为“墙时间”和“CPU时间”。我想我刚刚算出了,我想我是在传递地址并做地址算术。我算出了,我是在解引用并减去地址。
#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
return((double(*end - *start)/CLOCKS_PER_SEC)*1000);