我目前正在尝试实现一个函数,该函数将该函数的任何其他函数和一组有效输入值作为输入,并返回函数的结果以及打印执行它所需的时间。
以下是我现在所拥有的:
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);
有人可以给我一个前进的方法或关于如何进行的想法吗?
答案 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)...);
}