短版
在以下行中:
aData[i] = aData[i] + ( aOn * sin( i ) );
如果aOn
是0
或1
,处理器是否实际执行乘法运算,或者它是否有条件地计算出结果(0
对于0
,其他值1
)?
长版
我正在研究算法性能一致性,其中部分涉及到分支预测的效果。
假设是这段代码:
for ( i = 0; i < iNumSamples; i++ )
aData[i] = aData[i] + ( aOn * sin( i ) );
将提供比此代码更稳定的性能(分支预测可能会破坏性能):
for ( i = 0; i < iNumSamples; i++ )
{
if ( aOn )
aData[i] = aData[i] + sin( i );
}
是or ,它可以在另一个线程执行循环期间切换aOn
。0
1
实际的条件计算(+ sin( i )
在上面的示例中)涉及更多的处理,并且 if 条件必须在循环内(有多种条件,而不仅仅是上面示例中的一个;此外,更改为aOn
应该立即生效,而不是每个循环)。
忽略性能一致性,两个选项之间的性能权衡是执行if
语句所需的时间和乘法的时间。
无论如何,很容易发现,如果处理器不会对1
和之类的值执行实际乘法0
,则第一个选项可能是双赢的解决方案(无分支预测,性能更好)。