创建可变参数模板函数来测量和执行其他功能

时间:2016-08-01 19:41:56

标签: c++ templates c++11

我目前正在尝试实现一个函数,该函数将该函数的任何其他函数和一组有效输入值作为输入,并返回函数的结果以及打印执行它所需的时间。

以下是我现在所拥有的:

import shutil, os, time   
timestr = time.strftime("%Y%m%d")
Sourcepath = r'Z:\\test'
if not os.path.exists(Sourcepath):
        os.makedirs(Sourcepath+timestr)
source = os.listdir(Sourcepath)    
destinationpath = (Sourcepath+timestr)     
for files in source:
    if files.endswith('.json'):
        shutil.move(os.path.join(source,files),os.path.join(destinationpath,files))

我试着用这样的东西来运行它:

template<typename T, typename... Tail>

T measureAndExecute(const function<T(Tail...)> f, Tail... tail) {
    high_resolution_clock::time_point time1 = high_resolution_clock::now();
    T res = f(tail...);
    high_resolution_clock::time_point time2 = high_resolution_clock::now();
    auto duration = duration_cast<milliseconds>(time2 - time1).count();
    cout << duration << " milliseconds" << endl;
    return res;
}

这是在Fibonacci系列中查找术语的函数。

当我尝试运行它时,我收到以下错误:

int res = measureAndExecute(function<int(vector<int>&, vector<bool>&, unsigned long)> fibonacci, terms, calculated, n-1);

有人可以给我一个前进的方法或关于如何进行的想法吗?

2 个答案:

答案 0 :(得分:4)

这是一种非常天真的基准测试方法。我建议你看看here更高级的东西。然而,如果你想坚持下去,你应该改为:

psutil

答案 1 :(得分:2)

我同意@ 101010这是一种对软件进行基准测试的不寻常方式。

也就是说,这里有一个解决方案,它也适用于具有void返回类型的函数(问题中的示例不会与它们一起使用):

#include<type_traits>
#include<iostream>

struct Check {
    Check(): time1{std::chrono::high_resolution_clock::now()} {}

    ~Check() {
        std::chrono::high_resolution_clock::time_point time2 = std::chrono::high_resolution_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(time2 - time1).count();
        std::cout << duration << " milliseconds" << std::endl;
    }

    std::chrono::high_resolution_clock::time_point time1;
};


template<typename F, typename... Tail>
typename std::result_of<F(Tail&&...)>::type measureAndExecute(F f, Tail&&... tail) {  
    Check check;
    (void)check;
    return f(std::forward<Tail>(tail)...);
}

int f(int i) { return i; }
void g() { }

int main() {
    measureAndExecute(f, 42);
    measureAndExecute(g);
}

基本思想是创建Check的实例并利用其生命周期来衡量时间。

修改

正如评论中所提到的,measureAndExecute的改进将是:

template<typename F, typename... Tail>
typename std::result_of<F&&(Tail&&...)>::type measureAndExecute(F &&f, Tail&&... tail) {  
    Check check;
    (void)check;
    return std::forward<F>(f)(std::forward<Tail>(tail)...);
}