Я хочу оптимизировать свое приложение, особенно скорость выполнения определенных функций.
Представьте, что есть класс с некоторыми функциями-членами
class Test
{
public:
Test();
virtual ~Test();
int init(int arg1, double arg2);
private:
[...]
, и в моем конструкторе я вызываю одну из следующих функций:эти методы
Test::Test()
{
[...]
int value = init(1, 1.2);
}
Как мне измерить время выполнения моего метода init(...)
красивым и чистым способом, не ломая мою программу?
В данный момент я использую следующий код
Test::Test()
{
[...]
auto start = std::chrono::high_resolution_clock::now();
int value = init(1, 1.2);
auto stop = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration = stop - start;
std::cout << duration.count() * 1000 << "ms\n";
}
Это работает, как и ожидалось, но я думаю, что это довольно грязно, и я хочу иметь "более чистое" решение.
Есть ли способ иметь какую-то функцию, которая принимает функцию-члени другие параметры, такие как
int value = countTime(function, arg1, arg2);
Я не знаю, возможно ли передать возвращаемое значение от function()
до countTime()
, чтобы не прерывать рабочий процесс моего кода.
РЕДАКТИРОВАТЬ: Это мой класс TimeMeasure
namespace tools
{
class TimeMeasure
{
public:
TimeMeasure()
{
m_start = std::chrono::high_resolution_clock::now();
}
virtual ~TimeMeasure()
{
m_stop = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> duration = m_stop - m_start;
std::cout << duration.count() << "ms\n";
}
public:
typedef std::chrono::time_point<std::chrono::high_resolution_clock> HighResClock;
private:
HighResClock m_start;
HighResClock m_stop;
};
template <typename T, typename F, typename... Args>
auto measure(T *t, F &&fn, Args... args)
{
tools::TimeMeasure timeMeasure;
return (t->*fn)(std::forward<Args>(args)...);
}
}
и в моем конструкторе Test()
Я использую функцию measure
таким образом
Test()
{
[...]
tools::measure(this, Test::init, filepath);
}
int init(const std::string& filepath) const
принимает здесь строку в файл.Так что в моем случае это всего лишь один аргумент
К сожалению, я получаю invalid use of non-static member function 'int init(const string&) const'
ошибку
Мне было бы интересно, если конструктор не является функцией-членом.Так почему я получаю эту ошибку?
РЕДАКТИРОВАТЬ 2:
Согласно ответу OznOg, я просто забыл передать указатель на свою функцию.
Так что это будет правильный вызов функции
tools::measure(this, &Test::init, filepath);