测量任何函数运行时间的模板



我想创建一个模板函数来测量任何其他函数的运行时间。到现在为止我做了什么:

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)
};
}
}

最新更新