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

use*_*127 2 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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Jar*_*d42 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

然后

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);
}
Run Code Online (Sandbox Code Playgroud)