测量任何功能经过时间的模板
Template that measures elapsed time of any function
我想创建一个模板函数来测量任何其他函数的运行时间。
到目前为止我做了什么:
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)};
}
可以调用
auto [ret, duration] = measureTime<FuncType>(Func, args..)
并且有效。
问题是我不知道如何让它在 return void
的函数上工作,因为 auto ret = func(..)
不再有意义了。如果我可以删除 FuncReturnType
参数也很好。
有什么想法吗?谢谢
P.S。我正在使用 C++17,没有提升
你可以这样做:
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)
};
}
}
我想创建一个模板函数来测量任何其他函数的运行时间。 到目前为止我做了什么:
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)};
}
可以调用
auto [ret, duration] = measureTime<FuncType>(Func, args..)
并且有效。
问题是我不知道如何让它在 return void
的函数上工作,因为 auto ret = func(..)
不再有意义了。如果我可以删除 FuncReturnType
参数也很好。
有什么想法吗?谢谢
P.S。我正在使用 C++17,没有提升
你可以这样做:
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)
};
}
}