如果您有一个永远不会改变且始终为零的变量 A、一个函数 F、一个函数 G 和一个函数 H,并在现代版 GCC 上使用 -O3 优化的现代英特尔台式机处理器上调用以下代码:
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
执行需要 2 秒。请注意,F 永远不会被调用,因为 A 始终为 0。或者,
for(i = 0; i < a_big_number; i++)
{
if(A != 0) H();
else G();
}
只需 1 秒即可执行。同样,A 始终为 0,并且永远不会调用 H。最后,
for(i = 0; i < a_big_number; i++)
{
G();
}
只需 0.5 秒即可执行。
鉴于前两个示例中的条件语句,为什么 F 和 H 的内容很重要?既然他们从来没有被召唤过,为什么他们所做的事情会有所不同呢?并且鉴于 Intel 处理器具有复杂的分支预测,处理器难道不应该弄清楚 G() 总是被调用,甚至永远不会在条件语句上浪费时间吗?我知道条件指令应该浪费一些时间,但我不明白为什么它会浪费这么多时间。