我有一个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);
//...
}
最佳答案
如果没有if语句,它将更快地工作。
如果语句使您的CPU占用正分支的80%,则在进行负分支时会导致高速缓存未命中。
只要您能够摆脱“ if”语句,那么您就可以取得巨大的进步。
考虑到没有正分支的情况,通常情况下(正分支的通常情况类似于if(argument!= NULL)),那么您应该获得显着的性能提升。
根据CPU类型(RISC或CISC),性能增益也会有所不同。
关于c++ - 函数指针数组相对于if块的性能优势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22591544/