受Haskell优雅的自动生成(随机)给定类型实例的方式的启发,例如在QuickCheck中,我尝试找出如何在C++中编写一个尽可能易于使用的基准测试框架。我想我将使用函数模板,可能借助C++11中的新功能,例如可变参数模板。我希望只需要指定一个函数或者更好的是函数模板和一个STL模板容器类型(反过来是其value_type),与函数的参数兼容。
我认为,对具有各种大小输入的函数进行基准测试与C++11中设置和生成线程的方式有些相似。我的第一次尝试将是复制thread类的构造函数并将其转换为benchmark函数。
称为
我认为,对具有各种大小输入的函数进行基准测试与C++11中设置和生成线程的方式有些相似。我的第一次尝试将是复制thread类的构造函数并将其转换为benchmark函数。
template< class Function, class ...Args >
inline
void benchmark( Function&& f, Args&&... args );
我不确定我们是否应该在这里使用右值引用。然而,f
和args
必须在调用benchmark
之前显式实例化,导致使用麻烦且不可用的问题。
这导致我尝试跳过调用参数,只使用模板参数:
namespace pnw
{
template <template <typename> class Function, typename Container>
inline
void benchmark_container()
{
Function<typename Container::iterator> f;
Container c(10);
f(c.begin(), c.end());
}
}
称为
typedef int T;
typedef std::vector<T> C;
pnw::benchmark_container<std::sort, C>();
然而,编译现在报错
tests/t_histogram.cpp: In function ‘void test_benchmark()’:
tests/t_histogram.cpp:56:44: error: no matching function for call to ‘benchmark_container()’
tests/t_histogram.cpp:56:44: note: candidate is:
tests/../benchmark.hpp:32:6: note: template<template<class> class Function, class Container> void pnw::benchmark_container()
我不确定C++是否能够仅通过另一个调用函数的模板参数来传递函数模板。
这是正确的方法吗?还是在C++11中不可能实现?我使用的是GCC-4.6。