【问题标题】:C++ - Time execution 0s with Chrono LibraryC++ - 时间执行 0 与 Chrono 库
【发布时间】:2020-04-02 21:56:42
【问题描述】:

我正在使用归并排序对数组进行排序。我使用 Chrono 库来测量时间,但有时结果为 0。

int main() {
    srand(50000);
    int A[N];
    for (int i = 0; i < N; i++) {
        A[i] = rand();
    }

    cout << "Array non ordinato\n";
    Stampa(A, N);
    auto start = std::chrono::system_clock::now();
    QuickSort(A, 0, N - 1);
    auto end = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed = end - start;
    cout << "\nArray ordinato\n";
    Stampa(A, N);
    cout << "Elapsed time in nanoseconds : "
         << chrono::duration_cast<chrono::nanoseconds>(end - start).count()
         << " ns" << endl;
    cout << "Elapsed time in milliseconds : "
         << chrono::duration_cast<chrono::milliseconds>(end - start).count()
         << " ms" << endl;
    cout << "Elapsed time: " << elapsed.count() << "s";
}

我用#define N 300 定义了N

如果N300,则经过时间(纳秒、毫秒或秒)是0。如果我增加N,我的经过时间大于零。我也需要时间来处理小型阵列。我该如何解决?

【问题讨论】:

  • 说真的,300 个项目几乎没有时间,因此结果为 0 也就不足为奇了。您应该运行数千甚至一百万左右的项目的测试。
  • 系统时钟的精度是多少?在我的系统上,system_clock::now() 返回一个std::__1::chrono::time_point&lt;std::__1::chrono::system_clock, std::__1::chrono::duration&lt;long long, std::__1::ratio&lt;1, 1000000&gt;&gt;&gt;&gt;,它以微秒为单位进行测量。
  • 尝试 std::chrono::steady_clock 而不是 std::chrono::system 时钟。

标签: c++ sorting time mergesort chrono


【解决方案1】:

如果您希望对较小的 N 排序更精确,我建议使用 high resolution clock 而不是系统时钟。

【讨论】:

  • 即使这样,您也可能会发现分辨率不足以代表所涉及的时间。高分辨率时钟可为您提供最佳可用分辨率,而该最佳分辨率在台式 PC 上仍可能为数十毫秒。
  • 是的,不幸的是,如果他们出于某种原因坚持低 N,那么这是他们拥有的最佳机会。无法为 OP 发明亚纳米时钟 :)
  • @user4581301 - 对于 Windows,QueryPerformanceCounter 是一个亚微秒计数器。在我的系统上,它在 Win 7 上以 3 兆赫兹以上的速度运行,在 Win XP 上以大约 3.5 千兆赫兹(cpu 时钟速度)运行。 Visual Studio 2015 及更高版本修复了 chrono 的 stable_clock 以使用与 QueryPerformanceCounter 相同的计数器。
  • 不错的时钟已经存在,但 chrono 实现是否使用时钟?我最近不得不放弃更改,因为如果我坚持使用纯 C++,我将无法比糟糕的 64 Hz Windows 滴答声更好。
  • @user4581301 - 如上所述,如果使用 std::chrono,这是 2015 年之前 Visual Studio 的问题,但如果使用 QueryPerformanceCounter,则不会出现问题。
【解决方案2】:

当您像问题一样测量时间时,您需要使用std::chrono::steady_clockis_steady 属性为true 的任何其他时钟。 std::chrono::system_clock 正在使用可能在任何给定时间更改的挂钟。这就是std::chrono::system_clock 的用途:代表系统的当前时间。

您可能还想使用更多的元素来查看任何有意义的时间差异。

虽然std::chrono::high_resolution 时钟单从它的名字来看很诱人,但值得注意的是,从技术上讲,chrono 中没有高分辨率时钟。相反,它是具有最高分辨率的时钟的别名。引用标准:

class high_resolution_clock 的对象表示带有 最短的滴答周期。 high_resolution_clock 可能是同义词 system_clocksteady_clock

当我们检查实现时,我们发现 MSVC 具有以下内容:

using high_resolution_clock = steady_clock;

而 libstdc++-v3 有:

/**
 *  @brief Highest-resolution clock
 *
 *  This is the clock "with the shortest tick period." Alias to
 *  std::system_clock until higher-than-nanosecond definitions
 *  become feasible.
*/
using high_resolution_clock = system_clock;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2017-09-02
    • 2023-03-13
    相关资源
    最近更新 更多