Функция измерения времени другой функции

Я хотел иметь функцию с именем timeit, которая может измерять время выполнения n итераций любой другой функции. Я все еще изучаю C ++, но пришел к выводу: какие-то мысли?

#include<chrono>

using namespace std;

template<typename output, typename ...ArgsT, typename ...Input>
double timeit(output (*function)(Input...), int n, ArgsT ...args)
{
   auto start = chrono::high_resolution_clock::now();
   for(int k = 0; k < n; ++k)
   {
      function(args...);
   }
   auto end = chrono::high_resolution_clock::now();
   chrono::duration<double> elapsed = (end-start);
   return elapsed.count();
}

1 ответ
1

Главное, что вам здесь не хватает, — это идеальная пересылка. Когда вы получаете пакет аргументов, он может содержать одну или несколько ссылок на rvalue. Но когда вы проходите args... функции, которую вы синхронизируете, вы дали имя пакету, поэтому, даже если то, что вы получили, было ссылками на rvalue, то, что вы в конечном итоге передаете временной функции, больше не будет ссылкой на rvalue.

Чтобы исправить это, вы должны использовать std::forward:

function(std::forward<ArgsT>(args)...);

Другое очевидное дополнение, которое я бы рассмотрел, — это сбор и возврат возвращаемых значений из ваших вызовов. Одна из возможностей — вернуть что-то вроде pair<double, std::vector<output>>, для хранения времени и возвращаемых значений.

  • Спасибо за ответ, посмотрю std::forward. Я впервые использовал набор аргументов, поэтому не думал о переходе по ссылкам.

    — ThomasL


  • @ThomasL: Что касается первой попытки, я бы сказал, что у вас все получилось на удивление хорошо (во всяком случае, намного лучше, чем моя первая попытка).

    — Джерри Гроб

  • Спасибо, я уверен, что у вас тоже все хорошо.

    — ThomasL


  • @ThomasL: С тех пор я стал лучше, но моя первая попытка была довольно уродливой. 🙂

    — Джерри Гроб

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *