C++ 关于<;chrono>;C+中的标题+;11
看看这个例子C++ 关于<;chrono>;C+中的标题+;11,c++,stl,c++11,chrono,C++,Stl,C++11,Chrono,看看这个例子 我注意到示例使用了std::chrono::system_clock::now()这是否意味着它只能用来测量经过的时间而不是CPU时间???如果我想测量CPU时间,我应该使用什么时钟 请注意,经过的时间:3s是四舍五入的整数。有没有办法使它更粒化 1) 我很确定你能得到的最高分辨率是使用std::chrono::high_resolution_clock,然后不进行任何持续时间转换: int elapsed_ticks = (end-start).count(); 2) 将dur
std::chrono::system_clock::now()代码>这是否意味着它只能用来测量经过的时间而不是CPU时间???如果我想测量CPU时间,我应该使用什么时钟李>
请注意,经过的时间:3s
是四舍五入的整数。有没有办法使它更粒化
1) 我很确定你能得到的最高分辨率是使用std::chrono::high_resolution_clock
,然后不进行任何持续时间转换:
int elapsed_ticks = (end-start).count();
2) 将duration\u cast的参数更改为类似于纳秒的值:
int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
(end-start).count();
int经过的秒数=std::chrono::duration\u cast
(结束-开始)。计数();
正确的
根据标准:
system_clock表示系统范围内实时时钟的墙上时钟时间
库不提供测量CPU时间的机制,因此,如果您想这样做,您必须使用旧的
库并使用std::clock()
(如果您的目标是Windows,那么您必须依靠Windows提供的任何特定于平台的API来获得CPU时间,因为正如您所指出的,Windows的std::clock()
无法正常工作。)
system\u clock
更像是std::time()
的对应物,而不是std::clock()
。(例如,请注意,system\u clock
提供了system\u clock::time\u point
s和time\u t
之间的转换)我认为,在
中缺少用于测量CPU时间的时钟是由于标准委员会的时间限制,并且该功能的使用少于系统的挂钟和实时时钟
如果您既想要CPU时间,又想要
提供的好处,则应实现符合标准中概述的时钟概念并提供CPU时间的时钟类型,可能在内部使用std::clock()
实现
上面写着
2.嗯,是的,你用了秒
。使用毫秒
和瞧,更粒化!见鬼,如果你想的话,用纳秒。@chris Hm…很好的建议。双已用秒=(std::chrono::duration_cast(end-start).count())/1000;旁白:请注意,我遇到了一个编译器,它将end
理解为std::end
。它可能是GCC4.7.1,但我可能错了。我知道最新版本的GCC不再这样做,但如果您有其他编译器将使用它,则需要注意。
是一个头(和名称空间),而不是一个类。我帮你们纠正了。问题是std::clock()
在Windows上测量墙时间,在Linux上测量CPU时间。@newprint是的,这很不幸。微软应该修复它们的实现以符合标准规范。作为一个(重要的)注意事项,VS2012中当前的std::chrono::high_resolution_clock
中存在一个“缺陷”,即使用QueryPerformanceCounter
并进行一些计算的分辨率要低得多。请参阅:此错误仍然存在于VS2013预览中。
int elapsed_ticks = (end-start).count();
int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
(end-start).count();
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();
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";