我有一个Solver类,它从System类中读取数据并计算系统当前状态的解决方案。根据系统数据,我应该调用不同的成员函数来获取巨大矩阵的每个值。我的问题是:如果我使用函数指针而不是if语句,我会获得更好的性能吗? (这个过程重复几次,我希望对其进行优化)
系统
class System
{
friend class Solver;
public:
void print();
//...
private:
double x[n];
int equationType[n];
//...
}
使用If语句解决
class Solver
{
public:
//...
void solve(){
for(int i=0; i<n; ++i){
if(sys->equationType[i] == 1)
solveForEq1(i, x[i]);
else if(sys->equationType[i] == 2)
solveForEq2(i, x[i]);
else if //...
}
private:
System *sys;
void solveForEq1(int, double);
void solveForEq2(int, double);
//...
}
具有函数指针的求解器(这实际上会起作用吗?更快?)
typedef void (Solver::*MemFuncPtr)(int, double);
class Solver
{
public:
//...
Solver(System* s) : sys(s){
mfp[0] = &Solver::solveForEq1;
mfp[1] = &Solver::solveForEq2;
}
void solve(){
for(int i=0; i<n; ++i)
*(mfp[equationType[i]])(i, x[i]);
}
private:
System *sys;
MemFuncPtr mfp[2];
void solveForEq1(int, double);
void solveForEq2(int, double);
//...
}
答案 0 :(得分:1)
没有if语句,它的工作速度会更快。
如果语句使你的CPU占正分支的80%,那么在进行负分支时会导致缓存未命中。
每当你能够摆脱“if”陈述时,你就取得了巨大的进步。
考虑到你没有正分支的情况,通常情况下(正分支的通常情况是if(argument!= NULL)),那么你应该有显着的性能提升。
性能增益也因CPU类型(RISC或CISC)而异。