我最近已经选择了迈克尔·艾布拉什(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(优化速度)在编译效率方面具有很大的不同。
这些优化通常很有用。但是,这通常是您编写程序后要做的事情,并确定该程序将从执行这些微观挑选中受益。
。此外,许多现代编译器都具有概要引导的优化,这可以减轻您必须扭曲您的代码出于性能的目的。