【问题标题】:std::chrono::milliseconds .count() returns in microseconds?std::chrono::milliseconds .count() 以微秒为单位返回?
【发布时间】:2019-01-21 10:18:48
【问题描述】:

我正在尝试记录一段时间内经过的毫秒数。

我有这样的课

// class member declarations
class MyClass {

    std::chrono::high_resolution_clock::time_point   m_start;
    std::chrono::system_clock::duration              m_elapsed;
};

我在课堂上有 2 个方法。一个从 main 调用,即 func1CalledFromMainThread。

// Class methods
using namespace std::chrono;
void MyClass::func1CalledFromMainThread() {

    m_start = std::chrono::high_resolution_clock::now();
}

另一个func2CalledFromADifferentThread 是从另一个线程调用的

void MyClass::func2CalledFromADifferentThread() {

    // after some time following line of code runs from a different thread
    auto end = high_resolution_clock::now();

    m_elapsed = duration_cast<milliseconds>(end - m_start);
    std::cout << "Elapsed time in milliseconds is " << m_elapsed.count()/1000 << std::endl;
}

问题出在cout 日志记录中。我看到我必须除以1000 才能得到m_elapsed 的毫秒数。 count 不是在这里返回std::chrono::milliseconds 的计数吗?为什么我必须在这里除以1000? count() 总是返回 microseconds 还是我做错了?

【问题讨论】:

  • 由于您是从不同的线程访问m_start,您应该查看std::mutex。
  • 这是一个视频&lt;chrono&gt; 教程:youtube.com/watch?v=P32hvk8b13M
  • @Angew。是的,我在实际代码中有互斥锁,它比这个例子复杂得多。我刚刚创建了一个示例代码来讨论和理解这个问题,而不涉及太多我认为有效的细节。非常感谢您的有用回答

标签: c++11 chrono milliseconds


【解决方案1】:

count 返回调用它的类型的刻度数。如果你这样写:

duration_cast<milliseconds>(end - m_start).count()

它会正确地给你毫秒数。但是,您没有将结果存储在 std::chrono::milliseconds 中,而是将其存储在 std::chrono::system_clock::duration(m_elapsed 的类型)中。因此,m_elapsed.count() 以std::chrono::system_clock::duration 的频率返回滴答数,在您的平台上可能是微秒。

换句话说,通过将结果存储在milliseconds 以外的其他位置,您可以立即撤消对milliseconds 的转换。

【讨论】:

    【解决方案2】:

    您使用system_clock::durationunits 而非milliseconds 存储持续时间。

    您的问题是std::chrono::system_clock::duration 没有使用毫秒作为滴答计数。 执行此行 m_elapsed = duration_cast&lt;milliseconds&gt;(end - m_start);时, 无论您是先使用duration_cast 将时间转换为milli,滴答计数都将始终以system_clock::duration 持续时间单位转换为microseconds。

    我只需将m_elapsed 声明为 std::chrono::duration&lt;long, std::milli&gt;,它应该可以按预期工作。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我通过简单的更改解决了它 来自:

      std::chrono::system_clock::duration              m_elapsed;
      

      到:

      auto m_elapsed;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多