如果块,则函数指针数组的性能优势

时间:2014-03-23 13:29:52

标签: c++ member-function-pointers

我有一个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);
    //...
}   

1 个答案:

答案 0 :(得分:1)

没有if语句,它的工作速度会更快。

如果语句使你的CPU占正分支的80%,那么在进行负分支时会导致缓存未命中。

每当你能够摆脱“if”陈述时,你就取得了巨大的进步。

考虑到你没有正分支的情况,通常情况下(正分支的通常情况是if(argument!= NULL)),那么你应该有显着的性能提升。

性能增益也因CPU类型(RISC或CISC)而异。