[英]What am I doing wrong with this timer?
我使用chrono试图实现一个计时器,但是我感觉好像缺少了一些东西。 在每次迭代中调用该函数很重要,但是某些指令只有在延迟后才会执行。 这是一个较大项目的简化示例。 我想念什么?
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
const double delay = duration_cast<milliseconds>(seconds(5)).count();
double counter = 0.f;
void doit(const double time)
{
if(counter < delay)
{
counter += time;
std::cerr <<"NOT DOING IT: "<<counter<<std::endl<<delay<<std::endl;
return;
}
counter = 0.f;
std::cerr <<"DOING IT"<<std::endl;
}
int main()
{
duration<double,std::milli> timetaken;
duration<double,std::milli> looptime;
auto start = high_resolution_clock::now();
auto end = high_resolution_clock::now();
timetaken = end - start;
auto loopstart = end;
while(timetaken < std::chrono::seconds(10))
{
looptime = duration_cast<milliseconds>(loopstart - end);
loopstart = end;
doit(looptime.count());
end = high_resolution_clock::now();
timetaken = end - start;
}
std::cerr<<"TT:"<<duration_cast<seconds>(timetaken).count()<<std::endl;
return 0;
}
输出显示所传递的延迟是循环的增量时间。 虽然耗时,但工作正常。 样本输出:不执行:2971 3000不执行:2971 3000不执行:3145 3000执行
问题是它仅在我打印“ DOING iT”或“ NOT DO IT”行时才起作用,所以我猜测当我将“ NOT DOIT IT”行注释为“不”时,计时器的分辨率不够好当我这样做时,没有“正在执行”输出。
编辑
好的,通常情况下,编写简化版本会为我指明正确的方向。 正如我提到的那样,这似乎是解决问题。 通过将单位更改为纳秒,它似乎可以按我期望的那样工作。 我仍然想听听任何人怀疑通用方法或有更聪明的想法/参考。 这是我的工作版本:
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
const double delay = duration_cast<nanoseconds>(seconds(2)).count();
double counter = 0.f;
void doit(const double time)
{
if(counter < delay)
{
counter += time;
//std::cerr <<"NOT DOING IT: "<<counter<<std::endl<<delay<<std::endl;
return;
}
counter = 0.f;
std::cerr <<"DOING IT"<<std::endl;
}
int main()
{
duration<double,std::nano> timetaken;
duration<double,std::nano> looptime;
auto start = high_resolution_clock::now();
auto end = high_resolution_clock::now();
timetaken = end - start;
auto loopstart = end;
while(timetaken < std::chrono::seconds(10))
{
looptime = duration_cast<nanoseconds>(end - loopstart);
loopstart = end;
doit(looptime.count());
end = high_resolution_clock::now();
timetaken = end - start;
}
std::cerr<<"TT:"<<duration_cast<seconds>(timetaken).count()<<std::endl;
return 0;
}
我认为您想核对参数中给出的时间,而不是延迟。
if(counter < time)
{
counter += delay;
std::cerr <<"NOT DOING IT: "<<counter<<std::endl<<delay<<std::endl;
return;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.