C ++ chrono :: duration_cast总是输出" 0秒"

时间:2016-04-28 11:52:59

标签: c++ g++ mingw chrono

这是我在这里的第一个问题,我也是C ++的新手,但我会尽我所能尽可能具体。请告诉我,我是否要模糊:

我试图通过使用chrono和duration_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";

我得到的输出总是&#34; 0秒&#34;,无论我做多大都需要排序。即使它排序了一百万个整数并且有一个明显的执行时间,它仍然给我相同的输出。

我基本上遵循此处给出的示例:http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

我只使用我的mergesort函数而不是f()。如何正确测量我的排序方法?

编辑:我在Windows 10中使用minGW通过Powershell进行编译。命令如下所示:

g++ -std=c++11 .\Merge.cpp

1 个答案:

答案 0 :(得分:1)

TL; DR :看起来std::chrono实现(libstdc ++)在Windows上相当差,你不会得到比秒更好的东西。

长版:

libstdc ++ typedef s std::chrono::high_resolution_clockstd::chrono::system_clock。根据{{​​3}},对std::chrono::system_clock::now()的调用将导致对以下某项内容的调用,具体取决于平台:

  • syscall(SYS_clock_gettime, CLOCK_REALTIME, ...),这是一个Linux系统调用
  • clock_gettime(CLOCK_REALTIME, ...),这是Windows不支持的POSIX系统调用
  • gettimeofday(...),这是Windows不支持的POSIX功能
  • std::time()作为后备补充

因此,在Windows上内部调用std::time()。未指定std::time()的编码;但是,大多数系统都遵循implementation

  

time()函数应返回自纪元以来的时间值。

Microsoft本身POSIX specification

  

自1970年1月1日午夜起经过时返回时间,如果出现错误,则返回-1。

我认为可以肯定地说,你不会使用MingW std::chrono获得更高的分辨率。

至于你的问题,你有两个选择:

  1. 如果您的程序仅在Windows上运行,则可以使用the same
  2. 构建自己的时间测量
  3. 如果您想保持便携,请使用QueryPerformanceCounter。它使用Boost.Chrono并且应该提供更好的分辨率。