我有几个关于新的问题<chrono>
C++ 11 中的标头。使用 Windows 7、Visual Studio 2012。
看例子http://en.cppreference.com/w/cpp/chrono http://en.cppreference.com/w/cpp/chrono
#include <iostream>
#include <chrono>
#include <ctime>
int fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
int result = fibonacci(42);
end = std::chrono::system_clock::now();
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds << "s\n";
}
可能的输出
finished computation at Sat Jun 16 20:42:57 2012
elapsed time: 3s
- 我注意到该示例使用
std::chrono::system_clock::now();
这是否意味着它只能用于测量经过的时间而不是 CPU 时间???如果我想测量 CPU 时间,我应该使用什么时钟?
- 请注意
elapsed time: 3s
输出四舍五入为整数。有没有办法让它变得更颗粒化?
-
Correct
根据标准:
system_clock 代表系统范围实时时钟的挂钟时间。
The <chrono>
库不提供测量 CPU 时间的机制,所以如果你想要的话,你必须依靠旧的<ctime>
库和使用std::clock()
.
(如果您的目标是 Windows,您将不得不依靠 Windows 提供的任何特定于平台的 API 来获取 CPU 时间,因为正如您所指出的,它们的std::clock()
无法正常工作。)
system_clock
更像是一个对应物std::time()
比std::clock()
。 (例如,请注意system_clock
提供之间的转换system_clock::time_point
s and time_t
.)我想缺少时钟<chrono>
用于测量 CPU 时间的原因是由于标准委员会的时间限制以及该功能比系统挂钟和实时时钟使用较少的事实。
如果您想要 CPU 时间,但也想要以下好处<chrono>
规定,您应该实现一个时钟类型,该类型符合标准中概述的时钟概念,并提供 CPU 时间,可能在内部使用std::clock()
.
-
这条线说
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
是导致时间四舍五入为整数秒的原因。您可以选择任何您想要的周期,也可以使用浮点表示形式以允许非整数值:
std::int64_t elapsed_attoseconds =
std::chrono::duration_cast<std::chrono::duration<std::int64_t, std::atto>>
(end-start).count();
double elapsed_seconds =
std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>
(end-start).count();
请注意,在实际代码中,您应该避免使用.count()
逃避由提供的强类型chrono::duration
直到你绝对必须这样做。
auto total_duration = end - start;
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(total_duration);
auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(total_duration - seconds);
std::cout << seconds.count() << "s " << milli.count() << "ms\n";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)