定时功能:双返0 MS

时间:2017-10-06 03:03:01

标签: c++ double

我正在为一个我必须为一个类写的数据结构编写一个深入的测试程序。我试图计算执行函数和将它们存储在一个数组中以便以后打印需要多长时间。为了仔细检查它是否正常工作,我决定立即打印,我发现它无法正常工作。

以下是我获取时间并将它们存储在结构中的数组中的代码。

void test1(ArrayLinkedBag<ItemType> &bag,TestAnalytics &analytics){
    clock_t totalStart;
  clock_t incrementalStart;
  clock_t stop; //Both timers stop at the same time;
  // Start TEST 1
  totalStart = clock();
  bag.debugPrint();

  cout << "Bag Should Be Empty, Checking..." << endl;
  incrementalStart = clock();
  checkEmpty<ItemType>(bag);
  stop = clock();
  analytics.test1Times[0] = analytics.addTimes(incrementalStart,stop);
  analytics.test1Times[1] = analytics.addTimes(totalStart,stop);
  cout << analytics.test1Times[0] << setprecision(5) << "ms" << endl;
  std::cout << "Time: "<< setprecision(5)  << (stop - totalStart) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;
    cout << "===========================================" << endl; //So I can find the line easier

}

以下是我正在进行数组计算的代码,此函数位于TestAnalytics结构中

double addTimes(double start, double stop){
    return (stop - start)/ (double)(CLOCKS_PER_SEC/1000);
  }

以下是我得到的输出片段:

Current Head: -1
Current Size: 0
Cell: 1, Index: 0, Item: 6317568, Next Index: -2
Cell: 2, Index: 1, Item: 4098, Next Index: -2
Cell: 3, Index: 2, Item: 6317544, Next Index: -2
Cell: 4, Index: 3, Item: -683175280, Next Index: -2
Cell: 5, Index: 4, Item: 4201274, Next Index: -2
Cell: 6, Index: 5, Item: 6317536, Next Index: -2
Bag Should Be Empty, Checking...
The Bag Is Empty
0ms
Time: 0 ms
===========================================

我正在尝试根据此网站上的不同帖子计算时间。 我在UNIX系统上使用clang编译器。该数字是否仍然太小而不能显示在0以上?

2 个答案:

答案 0 :(得分:1)

除非您使用旧的(pre-C ++ 11)编译器/库,否则我将使用<chrono>标题中的函数:

template <class ItemType>
void test1(ArrayLinkedBag<ItemType> &bag){
    using namespace std::chrono;

    auto start = high_resolution_clock::now();
    bag.debugPrint();
    auto first = high_resolution_clock::now();
    checkEmpty(bag);
    auto stop = high_resolution_clock::now();

    std::cout << " first time: " << duration_cast<microseconds>(first - start).count() << " us\n";
    std::cout << "second time: " << duration_cast<microseconds>(stop - start).count() << " us\n";
}

有些部分有点冗长(说得好),但它仍然运作得相当好。 duration_cast支持低至(至少)nanoseconds的差异类型,这通常足以对即使相对较小/快速的代码进行计时(尽管它不能保证它使用具有纳秒的计时器精度)。

答案 1 :(得分:1)

除了Jerry's good answer(我已经投票)之外,我还想添加一些可能有用的信息。

对于时间安排,我建议steady_clock超过high_resolution_clock,因为在您的时间安排期间steady_clock保证不会被调整(特别是向后)。现在在Visual Studio和clang上,这不可能发生,因为high_resolution_clocksteady_clock是完全相同的类型。但是,如果您使用的是gcc,则high_resolution_clocksystem_clock的类型相同,可能会随时进行调整(例如通过NTP更正)。

但是如果你使用steady_clock,那么在每个平台上你都有一个类似秒表的计时器:不好告诉你一天中的时间,但不会在不合适的时刻得到纠正。

此外,如果您使用my free, open-source, header-only <chrono> extension library,则可以更友好的方式流式传输持续时间,而无需使用duration_cast.count()。它将打印持续时间单位以及值。

最后,如果你连续多次调用steady_clock::now()(两者之间没有任何内容),并打印出这种差异,那么你就可以了解你的实现能够准确计算时间。它可以缩短飞秒的时间吗?可能不是。它是否像毫秒一样粗糙?我们希望不会。

总之,以下程序编译如下:

clang++ test.cpp -std=c++14 -O3 -I../date/include

该计划:

#include "date/date.h"
#include <iostream>

int
main()
{
    using namespace std::chrono;
    using date::operator<<;
    for (int i = 0; i < 100; ++i)
    {
        auto t0 = steady_clock::now();
        auto t1 = steady_clock::now();
        auto t2 = steady_clock::now();
        auto t3 = steady_clock::now();
        auto t4 = steady_clock::now();
        auto t5 = steady_clock::now();
        auto t6 = steady_clock::now();
        std::cout << t1-t0 << '\n';
        std::cout << t2-t1 << '\n';
        std::cout << t3-t2 << '\n';
        std::cout << t4-t3 << '\n';
        std::cout << t5-t4 << '\n';
        std::cout << t6-t5 << '\n';
    }
}

在macOS上为我输出:

150ns
80ns
69ns
53ns
63ns
64ns
88ns
54ns
66ns
66ns
59ns
56ns
59ns
69ns
76ns
74ns
73ns
73ns
64ns
60ns
58ns
...