用户指定的参数,用于确定在大循环中调用哪个函数

时间:2018-06-07 11:25:32

标签: c++ optimization

我正在开发一个主程序中有大循环的程序(数百万次迭代)。在循环中有函数调用,但调用的函数取决于用户指定的参数。因此,一个天真的解决方案是在main中的循环内部使用条件语句来检查用户指定的参数(请参阅代码片段)。然而,这并不是最好的解决方案,因为我希望我的程序快速(优化非常重要)。我也考虑了函数指针和虚函数,但这些对我来说似乎也很慢(函数指针到目前为止一直是我最好的选择,因为函数无论如何都无法内联,因为在运行时期间确定调用哪个函数)。

我认为我的问题最好通过一个例子说明,因为我无法用文字表达:

int func1(params){
  //Do stuff
}

int func2(params){
  //Do other stuff
}

int func3(params){
  //Do different stuff
}    

int main(int argc, char** argv){

  int some_value;

  for(int i = 0; i < 10000000; i++){
    if(argv[1] == option_one){
      some_value += func1(params);
    }

    if(argv[1] == option_two){
      some_value += func2(params);
    }
    if(argv[1] == option_three){
      some_value += func3(params);
    }
  }
}

这感觉就像一个非常常见的问题,所以有一个有效的解决方案吗?

提前致谢!

1 个答案:

答案 0 :(得分:5)

以其他方式做到:

if (argv[1] == option_one){
    for(int i = 0; i < 10000000; i++){
        some_value += func1(params);
    }
} else if (argv[1] == option_two){
    for(int i = 0; i < 10000000; i++){
        some_value += func2(params);
    }
} else if (argv[1] == option_three){
    for(int i = 0; i < 10000000; i++){
        some_value += func3(params);
    }
}

可能为循环创建模板函数以避免重复。

template <typename F>
int my_accumulate(F&& f)
{
    int some_value = 0;
    for (int i = 0; i != 10'000'000; ++i) {
        some_value += f(params);
    }
    return some_value;
}

然后

if (argv[1] == option_one){
    some_value = my_accumulate(&func1);
} else if (argv[1] == option_two){
    some_value = my_accumulate(&func2);
} else if (argv[1] == option_three){
    some_value = my_accumulate(&func3);
}