【问题标题】:std::chrono and coutstd::chrono 和 cout
【发布时间】:2011-12-14 21:43:21
【问题描述】:

我有一个愚蠢的问题。我尝试切换到 c++11 标头,其中之一是 chrono。但我的问题是我无法计算时间运算的结果。例如:

auto t=std::chrono::high_resolution_clock::now();
cout<<t.time_since_epoch();

给予:

初始化‘std::basic_ostream&lt;_CharT, _Traits&gt;&amp; std::operator&lt;&lt;(std::basic_ostream&lt;_CharT, _Traits&gt;&amp;&amp;, const _Tp&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Tp = std::chrono::duration&lt;long int, std::ratio&lt;1l, 1000000l&gt; &gt;]’的参数1 ... /usr/include/c++/4.6/ostream

cout<<(uint64_t)t.time_since_epoch();

给出无效的演员表

【问题讨论】:

    标签: c++ time c++11 chrono


    【解决方案1】:

    正如其他人所说,您可以调用count() 成员函数来获取内部计数。

    我想补充一点,我正在尝试向该库添加一个新标头:&lt;chrono_io&gt;。它记录在here&lt;chrono_io&gt; 与仅使用 count() 相比的主要优点是可以为您打印出编译时单元。这些信息当然可以手动获取,但只为您提供库要容易得多。

    对我来说,你的例子:

    #include <iostream>
    #include <chrono_io>
    
    int main()
    {
        auto t = std::chrono::high_resolution_clock::now();
        std::cout << t.time_since_epoch() << '\n';
    }
    

    输出:

    147901305796958 nanoseconds
    

    执行此操作的源代码是开源的,可在上面的链接中找到。它包含两个标头:&lt;ratio_io&gt;&lt;chrono_io&gt;,以及 1 个源:chrono_io.cpp

    此代码应视为实验性代码。它不是标准的,几乎可以肯定不会按原样标准化。事实上,来自 LWG 的初步 cmet 表明他们更希望默认输出是该软件所称的“短格式”。可以通过以下方式获得此替代输出:

    std::cout << std::chrono::duration_fmt(std::chrono::symbol)
              << t.time_since_epoch() << '\n';
    

    然后输出:

    147901305796958 ns
    

    更新

    只用了十年,但现在 C++20 做到了:

    #include <chrono>
    #include <iostream>
    
    int main()
    {
        auto t = std::chrono::high_resolution_clock::now();
        std::cout << t.time_since_epoch() << '\n';
    }
    

    输出:

    147901305796958ns
    

    【讨论】:

    • 根据我最初的问题,你可以猜到我不是 cpp 大师 :),但你为什么不重载 time_since_epoch t.time_since_epoch(chrono::print_unit)
    • 此时地球上的计时大师很少。所以你做得很好! :-) 我可能误解了您的建议,但听起来您建议设置持续时间的单位,至少用于打印目的。这可能会导致不精确的转换以静默方式发生,而计时码表的设计已经难以防止这种情况发生。 IE。只有在转换没有截断错误时,不同的持续时间类型才会隐式转换。
    • 我明白了,谢谢。 C++ 中的传统做法是使用stream &lt;&lt; object 打印内容(这是您尝试的第一件事)。并且最好坚持传统,以免混淆所有人(除非您想设计一个全新的 I/O 系统)。至于单独的标头,我可以谈论将所有功能放入&lt;chrono&gt;。这是一个工程权衡(增加了许多用例的编译时间)。标准化时间表:我们很幸运在 C++11 中看到 &lt;chrono&gt;。相反,我们几乎得到了 C12 的 xtime。标准化比设计难。
    • 很遗憾地看到,搜索有关 chrono i/o 的建议除了这个答案之外什么都没有。我们真的需要这样的补充。还修复了您的链接,因为它们已损坏。
    • 打印持续时间现在在 C++20 草案规范中,但确切的语法和格式与我的答案中显示的不同。
    【解决方案2】:

    通过 google 快速搜索发现此页面:http://en.cppreference.com/w/cpp/chrono/duration,您可以在其中找到打印持续时间的示例。

    编辑:它已移至http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

    【讨论】:

    • 我使用那个 wiki,但我从来没有找到它... tnx
    • 请注意,链接示例的不同之处在于它打印了 now() 的两次调用之间的差异,并且不涉及 time_since_epoch()。事实上,time_since_epoch 没有指定实际的纪元(这取决于您从中获得 time_point 的时钟)。因此,简而言之,如果没有有关时代的相关信息,您打印的持续时间是没有意义的。
    【解决方案3】:

    如果您希望以毫秒为单位进行计时,您可以这样做:

    auto t1 = std::chrono::high_resolution_clock::now();
    //process to be timed
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "process took: "
        << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
        << " milliseconds\n";
    

    不要忘记在包含的标题中添加:

    #include <chrono> //timing
    

    【讨论】:

      【解决方案4】:

      不确定你对这个演员有什么期望,也许你想要t.time_since_epoch().count()

      【讨论】:

        猜你喜欢
        • 2019-10-30
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 2013-10-25
        • 1970-01-01
        • 2013-12-05
        相关资源
        最近更新 更多