Измерение времени выполнения функций - PullRequest
0 голосов
/ 11 ноября 2018

Я застрял при измерении времени выполнения для функций в C ++. Я попытался clock_t clock(void), но он измеряет только время для одной функции в программе. В следующем простом примере, как я могу измерить время для двух функций?

#include <iostream>

using namespace std;

int add(int a, int b)
{
    return a+b;
}

int subtract(int a, int b)
{
    return a - b;
}

int main()
{
    int a,b;
    cin >> a >> b;

    int c = add(a,b);
    int d = subtract(a,b);
    cout << c << " " << d << "\n";
    return 0;
}

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы хотите сделать бенчмаркинг, вместо использования std :: clock_t вам следует рассмотреть возможность использования time_point<high_resolution_clock> с использованием std::chrono:

    using namespace std::chrono; 

    high_resolution_clock::time_point t = high_resolution_clock::now();
    //... do what is to be measured
    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    cout << duration_cast<milliseconds>(t2 - t).count();

Однако время - это всегда неточная мера, которая зависит от разрешения часов (например, для окон разрешение составляет около 15 мс). Таким образом, чем короче время измерения, тем выше относительная погрешность измерения. Таким образом, если выполнение вашей функции занимает 15 мс, в Windows вы получите ошибку в размере +/- 100%.

Единственный способ повысить надежность измерения - это измерить более длительное время, имея огромное количество итераций. Таким образом, в примере с 1 миллионом итераций относительная погрешность меры составляет 0,0001%.

Если вы можете сравнить свои функции отдельно, просто сделайте это так. Но если вы не можете измерить свои функции отдельно (например, потому что один производит ввод для другого), вы не можете использовать этот подход). Если вы хотите найти узкое место в вашем коде в таком случае, вам следует использовать правильный инструмент: a profiler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...