1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
template<typename Ret,typename Type ,typename ...Args>
class MemberFunctionBench :public BenchmarkBase,
private MemberFunctionCaller<Ret,Type, Args ...>
{
public:
MemberFunctionBench(std::string const & name,
Ret (Type::*fun)(Args...) , Type object, Args... args):
BenchmarkBase(name),
MemberFunctionCaller<Ret, Type, Args ...>(fun, object, args...){}
MemberFunctionBench(std::string const & name,
size_t loopSize,
Ret (Type::*fun)(Args...) , Type object, Args... args):
BenchmarkBase(name,loopSize),
MemberFunctionCaller<Ret, Type, Args ...>(fun, object, args...){}
MemberFunctionBench(std::string const & name,
size_t groupSize,
size_t loopSize,
Ret (Type::*fun)(Args...) , Type object, Args... args):
BenchmarkBase(name,groupSize, loopSize),
MemberFunctionCaller<Ret, Type, Args ...>(fun, object, args...){}
private:
struct SinglePass
{
SinglePass( std::function< Ret() > &fun ):fun(fun){}
std::function< Ret() > &fun;
Chronometer chrono;
void call()
{
chrono.start();
fun();
chrono.stop();
}
};
void executeSimpleLoop()
{
IterationGroup tempGroup(runNumber(),groupCount()+1);
std::vector<SinglePass> tab;
size_t toadd =BenchmarkBase::loopSize();
for(size_t i = 0; i< toadd;++i)
{
tab.push_back(SinglePass(MemberFunctionCaller<Ret,Type, Args ...>::fun_));
}
Chronometer chrono;
chrono.start();
for(size_t i = 0; i< tab.size();++i)
{
tab[i].call();
}
chrono.stop();
for(size_t i = 0; i< tab.size();++i)
{
tempGroup.add(tab[i].chrono.duration());
}
tempGroup.setGroupDuration(chrono.duration());
addToGroups(tempGroup);
}
void executeSimpleCall()
{
IterationGroup group(runNumber(),groupCount()+1);
Chronometer chrono;
chrono.start();
this->exec();
chrono.stop();
group.add(chrono.duration());
group.setGroupDuration(chrono.duration());
addToGroups(group);
}
}; |
Partager