实现定时器测量作为参数的函数执行时间

时间:2016-03-02 21:10:01

标签: c++ function timer

对于普通函数,至少那些单个参数,没有问题。但是,我正在尝试测量一堆具有多个参数的不同排序算法的执行时间,其中一个参数是向量。

这是main中包含的计时器:

clock_t begin = clock();
FunctionToTime();
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
printf ("Elapsed time is %.2lf seconds.", elapsed_secs );
return 0;

作为参数传递给定时器的示例函数示例:     SelectionSort(dataVector,dataVector.size());

是否可以创建一个接受排序算法作为函数参数的函数并测量该内部函数的执行时间?

我尝试过几种方法,但都没有成功。这可能吗?

2 个答案:

答案 0 :(得分:1)

#include <windows.h> //win header for large integer and query performance

考虑这个秒表课程:

class stopwatch
{
double PCFreq = 0.0;
__int64 CounterStart = 0;
LARGE_INTEGER li;

public:
    void StartCounter()
    {
        if (!QueryPerformanceFrequency(&li))ExitProcess(0);
        PCFreq = double(li.QuadPart) / 1000.0;
        QueryPerformanceCounter(&li); CounterStart = li.QuadPart;
    }

    double GetCounter() 
    { 
        QueryPerformanceCounter(&li); 
        return double(li.QuadPart - CounterStart) / PCFreq; 
    }
};

要使其工作,您需要创建该类的对象,例如:

stopwatch mystopwatch;

将具有启动/重置计时器并检查它的功能:

mystopwatch.StartCounter();//starts this specific objects timer over
mystopwatch.GetCounter(); //returns value in milliseconds

这样,您可以告诉它开始运行,并再次查询它,询问已经过了多少时间。 (非常精确)

while (mystopwatch.clockflag <= 5){};  //waits 5 milliseconds

使用它来解决你的问题不是很难。类似的东西:

double SelectionSort(dataVector, dataVector.size())
{
    stopwatch mystopwatch;
    mystopwatch.StartCounter(); //starts the clock timer
//...run actual function here..//
    return mystopwatch.GetCounter(); //return time in milliseconds
}

将进行计算,启动计时器,然后以毫秒为单位返回所用的时间。

答案 1 :(得分:0)

您的问题不是关于计时功能,而是关于通用函数包装器。使用C ++ 14,这是一项微不足道的任务。

以下是一个例子:

template <class F, class... ARGS>
auto wrapper(F func, ARGS&&... args) {
    clock_t begin = clock(); // better stuff from chrono
    auto r = func(std::forward<ARGS...>(args...));
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    printf ("Elapsed time is %.2lf seconds.", elapsed_secs );

    return r;
}