这是我在这里提出的第一个问题,我也是 C++ 的新手,但我会尽力尽可能具体。请告诉我我是否含糊不清:
我试图测量排序方法(合并排序)使用 chrono 和uration_cast 对给定整数数组进行排序所需的时间。这是有问题的代码片段:
auto t1 = std::chrono::high_resolution_clock::now();
mergesort(sortingArray, temp, 0, num - 1);
auto t2 = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
std::cout << fp_ms.count() << " seconds\n";
无论我将需要排序的数组设置多大,我得到的输出始终是“0 秒”。即使它对一百万个整数进行排序并且执行时间很长,它仍然给出相同的输出。
我基本上遵循这里给出的示例:http://en.cppreference.com/w/cpp/chrono/duration/duration_cast http://en.cppreference.com/w/cpp/chrono/duration/duration_cast
只是我使用的是归并排序函数而不是 f() 。如何让它正确测量我的排序方法?
编辑:我在 Windows 10 中使用 minGW 通过 Powershell 进行编译。命令如下所示:
g++ -std=c++11 .\Merge.cpp
TL;DR: 看起来像std::chrono
Windows 上的实现(libstdc++)相当差,你不会得到比秒更好的东西。
长版:
libstdc++ 库typedef
s std::chrono::high_resolution_clock
to std::chrono::system_clock
。根据执行 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B11/chrono.cc打电话给std::chrono::system_clock::now()
将导致调用以下其中一项,具体取决于平台:
-
syscall(SYS_clock_gettime, CLOCK_REALTIME, ...)
,这是一个Linux系统调用
-
clock_gettime(CLOCK_REALTIME, ...)
,这是 Windows 不支持的 POSIX 系统调用
-
gettimeofday(...)
,这是 Windows 不支持的 POSIX 函数
-
std::time()
作为后备
Thus, std::time()
在 Windows 上内部调用。的编码为std::time()
未指定;然而,大多数系统都遵循POSIX规范 http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html:
time() 函数应返回时间值seconds自纪元以来。
微软自己也这么做the same https://msdn.microsoft.com/en-us/library/1f4c8f33.aspx:
返回时间为seconds自 1970 年 1 月 1 日午夜以来经过的时间,如果出现错误,则为 -1。
我认为可以肯定地说,MingW 不会获得更高的分辨率std::chrono
.
至于你的问题,你有两个选择:
- 如果您的程序仅在 Windows 上运行,您可以使用以下命令构建自己的时间测量查询性能计数器 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904%28v=vs.85%29.aspx
- 如果您想保持便携使用Boost.Chrono http://www.boost.org/doc/libs/1_60_0/doc/html/chrono.html。它使用本机 Windows API http://www.boost.org/doc/libs/1_60_0/doc/html/chrono/appendices.html#chrono.appendices.implementation并且应该提供更好的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)