我在C ++的基础水平上,所以如果我遗漏了一些明显的东西,请原谅。
我正在计划一个可以在两种模式下运行的程序。 它运行的模式将由程序在首次启动时读取的配置文件中的标志决定。 读完这个配置文件后,程序将进入循环,循环数百万次。
在循环中的某一点上,代码会根据配置文件中设置的模式执行不同的操作。
显然我可以使用IF。如果模式1执行actions1,则在模式2执行actions2时执行操作。 但我想节省IF的时间(记住它会发生数百万次)。
为此,我考虑将actions1和actions2放在它们自己的函数中并使用函数指针。
然后我可以设置函数指针,因为在循环之前正在读取配置文件,只需使用该指针代替IF。
但是,问题是当放入函数actions1和actions2有不同的参数时,所以我需要两个函数指针来适应这个意思我又回到了需要IF。
我可以使用全局变量来解决这个问题,但我宁愿不这样做。 任何人都可以提出解决方法吗?
或者我不应该担心数以百万计的IF的成本,编译器是否会看到descion已经完成而不是一遍又一遍地进行?
编辑:谢谢你的回答。 我使用这个非常简单的代码进行了测试:
int i = 2
int p = 10;
for(int f = 0; f <900000000; f ++)
{
if(p == 10)
i = p + f;}
当if存在时,实际运行速度比我评论时快20%。 我想这肯定是分支hpredictor在行动,但我仍然不知道为什么它比没有if的时候更快。
答案 0 :(得分:3)
在大多数现代处理器上,例如x86,都有一个“分支预测器”。处理器本身观察是否采用了条件分支的模式;如果你总是做出同样的决定,那么它应该非常有效。
最好的办法就是衡量。编写你的循环代码,首先没有任何条件(即只需硬编码来执行Action#1),并测量运行所需的时间,例如: 1000万次迭代。然后重新放入if
语句,然后重新测量。在你确认它有所作为之前,没有必要担心!
答案 1 :(得分:3)
首先,这是过早优化 - CPU的分支预测器非常擅长这种事情,我更担心维护并使用继承而不是函数指针。其次,使这个更快的唯一真正方法是预编译每个选择并在运行时将它们作为单独的库加载。
答案 2 :(得分:2)
我正处于C ++的基础水平 如果我失踪了,请原谅 显而易见的事。
显而易见的解决方案似乎是将if
移到循环之外。而不是写:
while (...)
{
if (flag)
{
// ...
}
else
{
// ...
}
}
你可以写:
if (flag)
{
while (...)
{
// ...
}
}
else
{
while (...)
{
// ...
}
}