std::chrono 和 cout

Posted

技术标签:

【中文标题】std::chrono 和 cout【英文标题】:std::chrono and 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();

给出无效的演员表

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于std::chrono 和 cout的主要内容,如果未能解决你的问题,请参考以下文章

为啥std:chrono:steady

使用 std::chrono 在 C++ 中输出日期和时间

使用 std::chrono 在 C++ 中输出日期和时间

C++ 中的时序逻辑错误(使用 std::chrono)

从 C++ 中的 std::chrono::time_point 中提取年/月/日等

如何使用 std::chrono 库设置特定时间?