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<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’
的参数1 ... /usr/include/c++/4.6/ostream
cout<<(uint64_t)t.time_since_epoch();
给出无效的演员表
【问题讨论】:
【参考方案1】:正如其他人所说,您可以调用count()
成员函数来获取内部计数。
我想补充一点,我正在尝试向该库添加一个新标头:<chrono_io>
。它记录在here。 <chrono_io>
与仅使用 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
执行此操作的源代码是开源的,可在上面的链接中找到。它包含两个标头:<ratio_io>
和 <chrono_io>
,以及 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 << object
打印内容(这是您尝试的第一件事)。并且最好坚持传统,以免混淆所有人(除非您想设计一个全新的 I/O 系统)。至于单独的标头,我可以谈论将所有功能放入<chrono>
。这是一个工程权衡(增加了许多用例的编译时间)。标准化时间表:我们很幸运在 C++11 中看到 <chrono>
。相反,我们几乎得到了 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的主要内容,如果未能解决你的问题,请参考以下文章