Измерьте время функций в другом классе - PullRequest
0 голосов
/ 10 февраля 2019

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

// helper.h

class Helper
{
public:
   Helper();
   ~Helper();

   template<class F, typename...Args>
   double funcTime(F func, Args&&... args);
};

// helper.cpp:
#include "Helper.h"
#include <chrono>
#include <utility>

typedef std::chrono::high_resolution_clock::time_point TimeVar;
#define duration(a) std::chrono::duration_cast<std::chrono::milliseconds>(a).count()
#define timeNow() std::chrono::high_resolution_clock::now()

template<typename F, typename... Args>
double Helper::funcTime(F func, Args&&... args)
{
 TimeVar t1 = timeNow();
 func(std::forward<Args>(args)...);
 return duration(timeNow() - t1);
}

Тот же код отлично работает, если вы вызываете его в том же классе, но генерирует LNK2019ошибка, если я позвоню с main.cpp.Цель состоит в том, чтобы обернуть эти функции так, чтобы я мог вызывать их с любой из моих функций.Что я здесь не так делаю?

// main.cpp
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Helper.h"

using namespace std;

int countWithAlgorithm(string s, char delim) {
   return count(s.begin(), s.end(), delim);
}

int main(int argc, const char * argv[]) 
{ 
 Helper h;
 cout << "algo: " << h.funcTime(countWithAlgorithm, "precision=10", '=') << endl;
 system("pause");
 return 0;
}

1 Ответ

0 голосов
/ 10 февраля 2019

Спасибо вам обоим за то, что вы направили меня в правильном направлении.Я знал о том факте, что большинство компиляторов не могут создавать экземпляры функций шаблона, но не знал, как этого избежать.Комментарий tntxtnt помог мне найти решение в объединенном помощнике.h:

//helper.h
//
#pragma once

#include <chrono>

typedef std::chrono::high_resolution_clock::time_point TimeVar;

#define duration(a) std::chrono::duration_cast<std::chrono::nanoseconds>(a).count()
#define timeNow() std::chrono::high_resolution_clock::now()

 class Helper
 {
 public:
   Helper();
   ~Helper();

 template<class F, typename...Args>
 double funcTime(F func, Args&&... args)
 {
    TimeVar t1 = timeNow();
    func(std::forward<Args>(args)...);
    return duration(timeNow() - t1);
 }
};

Я благодарю вас за быструю помощь!

...