计时库中的计数时间点

counting time point in chrono library

我是第一次使用 chrono 库,所以请宽容 C:。所以我想写一个简单的获取时间函数,return 只是处理器与计时的控制。但是当我尝试使用 clock() 函数从用 steady_clock::now() 初始化的时间点获取值时,gcc 说 time_point 不包含 count() 成员。

/home/siery/Documents/Project/ChangeStateMachine/main.cpp|41|error: ‘struct std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long long int, std::ratio<1ll, 1000000000ll> > >’ has no member named ‘count’|

代码如下:

float GetTime()
{
    float tic = 0.0;
    auto start = std::chrono::steady_clock::now();

    tic = (float)start.count();

    return tic;
}

谢谢!

编辑:

GetTime() 函数应该 return 当前时间来计算增量时间以频繁更新我程序中的对象,例如:

fPastTime = fCurrentTime;
fCurrentTime = GetTime();

fDt = fCurrentTime - fPastTime;
if (fDt >= 0.15f)
    fDt = 0.15f;
Update(fDt);

如您所见,time_point 没有 count 成员。

您需要调用 time_since_epoch 来获取持续时间,然后您可以调用 count

float GetTime()
{
    auto start = std::chrono::steady_clock::now();

    return start.time_since_epoch().count();
}

不过,我不确定 float 是这里的最佳选择——如果有选择,我更喜欢 long long 这样的东西。

您通常只需获取(并存储)开始时间(作为 time_point)和结束时间(也作为 time_point)。将两者相减得到一个 duration,从中你可以得到一个 count(但你通常想使用一个 duration_cast 将它变成更有意义的东西,比如 using/displaying 之前的纳秒它)。

推荐:

std::chrono::steady_clock::time_point
GetTime()
{
    return std::chrono::steady_clock::now();
}

如果您想要以基于浮点数的秒数表示的计时结果,请执行以下操作:

using fsec = std::chrono::duration<float>;
auto t0 = GetTime();
some_function();
auto t1 = GetTime();
fsec delta = t1 - t0;
std::cout << delta.count() << "s\n";
  • 您不对任何单位转换负责,因此您不会在这方面引入任何错误。
  • 代码很简单。简单 == 低风险。
  • 确实不需要 GetTime() 包装器。

编辑:

#include <chrono>

using namespace std::chrono;

using fsec = duration<float>;
using ftp = time_point<steady_clock, fsec>;

ftp
GetTime()
{
    return steady_clock::now();
}

int
main()
{
    auto fPastTime = GetTime();
    auto fCurrentTime = GetTime();

    auto fDt = fCurrentTime - fPastTime;
    if (fDt >= 0.15s)
        fDt = 0.15s;
    // ...
}

0.15s 需要 C++14。在 C++11 中看起来像:

    if (fDt >= fsec{0.15})
        fDt = fsec{0.15};