我有一个功能,在典型的程序运行中执行了数亿次。此功能执行某个主要任务,但是,如果用户需要,它应该执行该主要任务的一些轻微变化。实现这一点的显而易见的方法是这样的:
mvn install -Plambda
但是,这不是很优雅,因为void f(bool do_option)
{
// Do the first part
if (do_option)
{
// Optional extra code
}
// Continue normal execution
}
的值在程序运行期间不会改变。 do_option
语句经常被不必要地执行。
我通过将if
转换为模板参数来解决它。我每次想要更改它时都会重新编译程序。现在,这个工作流程是可以接受的:我不经常更改这些选项,我是唯一的用户/开发人员。但是在将来,这两件事情都会改变,所以我想要一个带命令行开关的二进制文件。
问题是:处理这种情况的最佳或最优雅的方法是什么?我不介意拥有一个包含许多do_option
副本的大型二进制文件。我可以从一组命令行参数创建一个映射到一个要执行的函数,或者可能使用一个开关。但是我不想手工维护这个地图 - 可能会有超过五个这样的参数。
顺便说一下,我知道有人会说我过早地进行了优化。这是正确的,我测试了它。在我的特定情况下,运行时f
的性能并不比我的模板构建差。这并不意味着如果可能有更好的解决方案我就不感兴趣了。
答案 0 :(得分:1)
在现代(非嵌入式)CPU上,分支预测器将足够智能以识别每次都采用相同的路径,因此if
语句是一种完全可接受(且可读)的处理方式你的情况。
在嵌入式处理器上,编译器优化应足够智能,以消除if
语句的大部分开销。
如果您真的很挑剔,可以使用前面提到的模板方法,并使用if
语句选择要执行的函数版本。