3 c++ if-statement logical-operators
我的教授曾经说过,if 语句相当慢,应该尽可能避免。我正在用 OpenGL 制作一个游戏,我需要很多它们。在我的测试中,通过短路将 if 语句替换为 AND 是有效的,但是它更快吗?
bool doSomething();
int main()
{
int randomNumber = std::rand() % 10;
randomNumber == 5 && doSomething();
return 0;
}
bool doSomething()
{
std::cout << "function executed" << std::endl;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我的目的是在渲染器的绘制函数中使用它。我的模型应该有标志,如果标志为真,则应该执行某个函数。
if 语句相当慢,应尽可能避免。
这是错误的和/或具有误导性的。大多数关于程序缓慢的简化陈述都是错误的。这个答案可能也有问题。
C++ 语句没有可归因于它们的速度。重要的是编译程序的速度。它由汇编语言指令组成;不是 C++ 语句。
可能更正确的说法是,分支指令可能相对较慢(在现代超标量 CPU 架构上)(当无法很好地预测分支时)(取决于您要比较的内容;有很多事情比昂贵的)。
Run Code Online (Sandbox Code Playgroud)randomNumber == 5 && doSomething();
if 语句通常被编译成使用分支指令的程序。短路逻辑与运算也经常被编译成使用分支指令的程序。用逻辑与运算符替换 if 语句并不是使程序更快的灵丹妙药。
如果您将逻辑与生成的程序与用 替换的相应程序进行比较if (randomNumber == 5)
,您会发现优化器识破了您的技巧,并在两种情况下生成相同的程序集。
我的模型应该有标志,如果标志为真,则应该执行某个函数。
为了避免分支,必须改变前提。您可以创建应调用函数的所有模型的序列,迭代该序列,然后无条件调用该函数 -> 无分支,而不是迭代所有模型的序列、检查标志并有条件地调用函数。这个替代方案更快吗?维护数据结构肯定会产生一些开销,而分支预测器可能使这变得不必要。唯一确定的方法是测量程序。