【发布时间】:2015-08-17 18:31:06
【问题描述】:
我偶然发现了this question/answer,它提到在大多数语言中,逻辑运算符如:
x == y && doSomething();
可以比使用if 分支做同样的事情更快:
if(x == y) {
doSomething();
}
同样地,它表示三元运算符:
x = y == z ? 0 : 1
通常比使用if 分支更快:
if(y == z) {
x = 0;
} else {
x = 1;
}
这让我在谷歌上搜索,这让我找到了this fantastic answer,它解释了分支预测。
基本上,它说的是 CPU 以非常快的速度运行,而不是放慢速度来计算每个 if 分支,它试图猜测会发生什么结果并将适当的指令放入其管道中。但如果猜错了,它就必须备份并重新计算相应的指令。
但这仍然没有向我解释为什么逻辑运算符或三元运算符的处理方式与if 分支不同。由于 CPU 不知道x == y 的结果,它是否还必须猜测是否将调用doSomething()(因此,所有doSomething 的代码)放入其管道?因此,如果它的猜测不正确,是否支持?同样,对于三元运算符,CPU在确定x中存储的内容时是否应该猜测y == z是否会评估为真,如果猜测错误则备份?
我不明白为什么编译器对分支的处理方式与其他任何条件语句不同。不应该以相同的方式评估所有条件吗?
【问题讨论】:
-
也许它必须做一些事情,第一个语句是表达式,另一个是代码块,意思是 jmp。
-
这更像是一个编译器问题而不是 CPU 问题。以这种方式使用时,三元运算符在功能上几乎与分支相同。但是由于某些原因,MSVC 和 GCC 等主要编译器在使用三元运算符时更有可能发出条件分支。
-
布尔运算符通常编译为分支。 CPU 无法区分。但是,一些分支也被编译成无分支指令。取决于优化器的质量。如果我们在这里谈论 C,编译器会为您处理。
标签: performance operation branch-prediction