C ++将高分辨率时钟与固定数字进行比较

时间:2018-11-24 16:46:08

标签: c++ emulation chrono

我正在开发一个仿真器,但我不明白如何将chrono库所测量的经过时间与(CPUCycles * 0.0000005这样的固定数字进行比较。

类似

auto lastTime = std::chrono::steady_clock::now();
while (condition)
{
    if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * 0.0000005))
    {
        //do something;
    }
    else
    {
        //do something else;
    }
}

此刻给我错误

  

错误C2676二进制'> =':'std :: chrono :: duration <__ int64,std :: nano>'   没有定义此运算符或未将其转换为可接受的类型   预定义的运算符

2 个答案:

答案 0 :(得分:1)

两个time_point对象之间的区别是duration,它们不能轻易地转换成任何数字。您必须显式构造一个适当的工期对象。

有一些标准化的持续时间别名,例如std::chrono::nanoseconds,您可以将其用作std::chrono::nanoseconds(500)

if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * std::chrono::nanoseconds(500)))

或者,如果您使用std::literals::chrono_literals命名空间,则可以使用“用户”定义文字ns

if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * 500ns))

答案 1 :(得分:1)

std::chrono::steady_clock::now() - lastTime返回一个duration,因此您需要将其与持续时间进行比较。这意味着什么,取决于您的比较值意味着什么。最好/正确的方法是将其转换为持续时间。

所以您的CPUCycles * 500返回的持续时间以纳秒为单位? (0.0000005 == 500e-9)然后告诉编译器:

if ((std::chrono::steady_clock::now() - lastTime) >= CPUCycles * std::chrono::nanoseconds(500))

看看这传达的含义有多干净?每500ns有1个周期->因此,您经过的时间是CPUCycles乘以该时间。

另一种方法是使用成员函数count()获取持续时间的计数,但您通常需要先转换持续时间:

auto diff = std::chrono::steady_clock::now() - lastTime;
if(std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count() >= CPUCycles * 500) ...

但这会失去chrono为您提供的所有清晰度。