std :: chrono不同的结果 - 固定的时间步进循环
问题描述:
有人能帮我找出差异在哪里吗?因为第一代码:std :: chrono不同的结果 - 固定的时间步进循环
#include <iostream>
#include <chrono>
#include <ratio>
using namespace std::chrono;
const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1));
nanoseconds accumulator(0);
nanoseconds counter(0);
steady_clock::time_point begin;
int i = 0;
int main()
{
while(true)
{
begin = steady_clock::now();
while(accumulator >= timePerFrame)
{
accumulator -= timePerFrame;
++i;
}
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
if(counter >= seconds(1))
{
std::cout << i << std::endl;
break;
}
}
}
输出:30,和一个第二代码:
#include <iostream>
#include <chrono>
#include <ratio>
using namespace std::chrono;
const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1));
nanoseconds accumulator(0);
nanoseconds counter(0);
steady_clock::time_point begin;
steady_clock::time_point end;
int i = 0;
int main()
{
while(true)
{
begin = steady_clock::now();
while(accumulator >= timePerFrame)
{
accumulator -= timePerFrame;
++i;
}
end = steady_clock::now();
accumulator += end - begin;
counter += end - begin;
if(counter >= seconds(1))
{
std::cout << i << std::endl;
break;
}
}
}
输出:60;
唯一的区别是在第二个示例中使用“结束”变量。在我看来,它不应该造成这样的差异。我的意思是,不是steady_clock :: now()与end = steady_clock :: now()完全相同?
答
不同的是,这里
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
的now()
返回2个不同的值的两个实例,从而counter
不会是同步于accumulator
和下一如果条件将触发一个迭代前面相比
end = steady_clock::now();
accumulator += end - begin;
counter += end - begin;
因为这两个,accumulator
和counter
增加了相同的数额。
您可以通过改变两个语句的顺序验证这
counter += steady_clock::now() - begin;
accumulator += steady_clock::now() - begin;
,将产生相当变幻莫测输出in my case i got a 117。
做得更可读的代码我会写这样的:
auto delta = end - begin;
accumulator += delta;
counter += delta;
这是一件好事,以避免输入一次完全一样的东西更多。在这种情况下,真正重要的是它们增加了相同的数量,所以为什么不在代码中明确表示?!
TL; DRsteady_clock::now()
是“相同”的end = steady_clock::now()
,但steady_clock::now()
当你调用它两次不会返回相同的值。
我忽略了它。谢谢你的快速回复。现在一切都很清楚。 :) –