Сроки выполнения операторов - C++

Возможный дубликат:
Как рассчитать время выполнения фрагмента кода в C++

Как я могу получить время, потраченное на определенный набор операторов в некотором коде C++?

что-то вроде time утилита под Linux, но только для некоторых конкретных утверждений.

8 ответов

Решение

Если вы используете GNU gcc/g++:

Попробуйте перекомпилировать с --coverage, перезапустить программу и проанализировать полученные файлы с помощью утилиты gprof. Он также напечатает время выполнения функций.

Редактировать: компилировать и связывать с -pg, а не с --coverage, --coverage для gcov (какие строки фактически выполняются).

Вы можете использовать <chrono> Заголовок в стандартной библиотеке:

#include <chrono>
#include <iostream>

unsigned long long fib(unsigned long long n) {
    return (0==n || 1==n) ? 1 : fib(n-1) + fib(n-2);
}

int main() {
    unsigned long long n = 0;
    while (true) {
        auto start = std::chrono::high_resolution_clock::now();
        fib(++n);
        auto finish = std::chrono::high_resolution_clock::now();

        auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish-start);
        std::cout << microseconds.count() << "µs\n";
        if (microseconds > std::chrono::seconds(1))
            break;
    }
}

Вам нужно измерить время самостоятельно. Небольшой класс секундомера, который я обычно использую, выглядит следующим образом:

#include <chrono>
#include <iostream>

template <typename Clock = std::chrono::steady_clock>
class stopwatch
{
    typename Clock::time_point last_;

public:
    stopwatch()
        : last_(Clock::now())
    {}

    void reset()
    {
        *this = stopwatch();
    }

    typename Clock::duration elapsed() const
    {
        return Clock::now() - last_;
    }

    typename Clock::duration tick()
    {
        auto now = Clock::now();
        auto elapsed = now - last_;
        last_ = now;
        return elapsed;
    }
};

template <typename T, typename Rep, typename Period>
T duration_cast(const std::chrono::duration<Rep, Period>& duration)
{
    return duration.count() * static_cast<T>(Period::num) / static_cast<T>(Period::den);
}

int main()
{
    stopwatch<> sw;
    // ...
    std::cout << "Elapsed: " << duration_cast<double>(sw.elapsed()) << '\n';
}

duration_cast не может быть оптимальным именем для функции, так как функция с таким именем уже существует в стандартной библиотеке. Не стесняйтесь придумать лучший.;)

Изменить: Обратите внимание, что Chrono из C++11.

std::chrono или же boost::chrono(в случае, если ваш компилятор не поддерживает C++11) можно использовать для этого.

std::chrono::high_resolution_clock::time_point start( 
    std::chrono::high_resolution_clock::now() );
....
std::cout << (std::chrono::high_resolution_clock::now() - start);

Вам нужно написать простую систему хронометража. В C++ нет встроенного способа.

#include <sys/time.h>

class Timer
{
private:
    struct timeval start_t;
public:
    double start() { gettimeofday(&start_t, NULL); }
    double get_ms() {
       struct timeval now;
       gettimeofday(&now, NULL);
       return (now.tv_usec-start_t.tv_usec)/(double)1000.0 +
              (now.tv_sec-start_t.tv_sec)*(double)1000.0;
    }
    double get_ms_reset() {
      double res = get_ms();
      reset();
      return res;
    }
    Timer() { start(); }
};

int main()
{
  Timer t();
  double used_ms;

  // run slow code..
  used_ms = t.get_ms_reset();

  // run slow code..
  used_ms += t.get_ms_reset();
  return 0;
}

Обратите внимание, что само измерение может существенно повлиять на время выполнения.

Возможный дубликат: как рассчитать время выполнения фрагмента кода в C++

Вы можете использовать стандартную библиотеку time.h C (более подробно об этом рассказано на http://www.cplusplus.com/reference/clibrary/ctime/). Следующая программа делает то, что вы хотите:

#include <iostream>
#include <time.h>

using namespace std;

int main()
{
    clock_t t1,t2;
    t1=clock();
    //code goes here
    t2=clock();
    float diff = ((float)t2-(float)t1)/CLOCKS_PER_SEC;
    cout << "Running time: " << diff << endl;

    return 0;
}

Вы также можете сделать это:

int start_s=clock();
// the code you wish to time goes here
int stop_s=clock();
cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;

Вот очень хороший фрагмент кода, который хорошо работает на Windows и Linux: /questions/36879080/kak-rasschitat-vremya-vyipolneniya-fragmenta-koda-v-c/36879116#36879116
Чтобы его использовать, запустите его и сохраните результат как "время начала", а после действия - "время окончания". Вычтите и разделите с той точностью, которая вам нужна.

Ты можешь использовать #inclide <ctime> заголовок. Это функции и их использование здесь. Предположим, вы хотите посмотреть, сколько времени тратит код. Вы должны взять текущее время непосредственно перед началом этой части и другое текущее время сразу после окончания этой части. Тогда возьмите разницу этих двух раз. Готовые функции объявлены в ctime сделать все эти работы. Просто проверьте вышеуказанную ссылку.

Другие вопросы по тегам