设置有条件的语句以利用指令预取优势(现代X86)



我最近已经选择了迈克尔·艾布拉什(Michael Abrash)的《汇编语言的禅宗》(从1990年起),并且正在阅读有关指导预摘要如何总是有利的部分,例如发生分支的情况(跳跃)。这是因为预取的所有指令不再是要执行的说明,因此必须获取更多的说明。

这让我想起了另一本旧书的优化,游戏编程大师的技巧 by Andre Lamothe,他建议在设置您的有条件的陈述时,您将最频繁地放置(或预期))首先。

例如:

if (booleanThatIsMostLikelyToBeTrue)
{
   // ...expected code
   // also the code that would've been prefetched
}
else
{
   // ...exceptional or less likely code
}

我的问题是:

1)是否想到了Lamothe的优化?(我不再有这本书)

2)这种优化是否仍然是现代机器上值得的编程习惯?(也许预取的处理方式与以前不同?)

您想将代码设置为尽可能少的分支,并在其时向后分支。如果要始终执行常见的事情,请进行更可靠的方法,然后测试例外:

做a;如果(测试)做b;

当然,这必须安排,以便如果发生B,则B会逆转B。

ZEN编程的重点是尝试完全消除IF语句。因此,例如,您只需10次编写同一语句,而不是循环10次(需要退出条件测试),瞧,瞧,没有if语句。另一个示例是,如果您要循环列表,则使用哨兵退出循环,而不是测试索引值。

如果您在C中工作,则很难将编译器吉米克做自己想做的事情。在if语句中将某些内容放在第一个或第二次,不会对编译结果产生影响。请注意,使用正确的编译器选项至关重要。例如,在Visual C 中使用/O2(优化速度)在编译效率方面具有很大的不同。

这些优化通常很有用。但是,这通常是您编写程序后要做的事情,并确定该程序将从执行这些微观挑选中受益。

此外,许多现代编译器都具有概要引导的优化,这可以减轻您必须扭曲您的代码出于性能的目的。

最新更新