我想创建一个模板函数来测量任何其他函数的运行时间。到现在为止我做了什么:
using TimeDuration = std::chrono::nanoseconds;
std::tuple<FuncReturnType, TimeDuration> measureTime(Func func, Args&&... args)
{
auto start = std::chrono::high_resolution_clock::now();
auto ret = func(std::forward<Args>(args)...);
auto end = std::chrono::high_resolution_clock::now();
return {ret, std::chrono::duration_cast<TimeDuration>(end - start)};
}
可以调用usingauto [ret, duration] = measureTime<FuncType>(Func, args..)
和工作。
问题是,我不知道如何使它对返回void
的函数工作,因为auto ret = func(..)
不再有意义了。如果我能去掉FuncReturnType
参数,那就太好了。
任何想法?由于
注:我正在使用c++ 17,没有boost
您可以这样做:
template <typename Func, typename ...Args>
auto measureTime(Func func, Args&&... args)
{
using FuncReturnType = decltype(func(std::forward<Args>(args)...));
const auto start = std::chrono::high_resolution_clock::now();
if constexpr (std::is_same_v<void, FuncReturnType>) {
func(std::forward<Args>(args)...);
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<TimeDuration>(end - start);
} else {
FuncReturnType ret = func(std::forward<Args>(args)...);
auto end = std::chrono::high_resolution_clock::now();
return std::tuple<FuncReturnType , TimeDuration>{
ret, std::chrono::duration_cast<TimeDuration>(end - start)
};
}
}