我有一个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/

10-11 22:36
查看更多