Optimization 设置条件语句以利用指令预取(现代x86)
我最近读了Michael Abrash的《汇编语言的禅宗》(1990年)一书,读了一节关于指令预取如何不总是有利的,比如发生分支(跳转)的情况。这是因为预取的所有指令不再是要执行的指令,因此必须提取更多指令 这让我想起了另一本旧书《游戏编程大师的诀窍》中的一个优化。在这本书中,安德烈·拉莫特建议,在设置条件语句时,应将最频繁(或预期)的路径放在第一位 例如:Optimization 设置条件语句以利用指令预取(现代x86),optimization,assembly,x86,Optimization,Assembly,X86,我最近读了Michael Abrash的《汇编语言的禅宗》(1990年)一书,读了一节关于指令预取如何不总是有利的,比如发生分支(跳转)的情况。这是因为预取的所有指令不再是要执行的指令,因此必须提取更多指令 这让我想起了另一本旧书《游戏编程大师的诀窍》中的一个优化。在这本书中,安德烈·拉莫特建议,在设置条件语句时,应将最频繁(或预期)的路径放在第一位 例如: if (booleanThatIsMostLikelyToBeTrue) { // ...expected code // a
if (booleanThatIsMostLikelyToBeTrue)
{
// ...expected code
// also the code that would've been prefetched
}
else
{
// ...exceptional or less likely code
}
我的问题是:
1) 拉莫特的优化建议是否考虑到了这一点?(我不再有这本书了)
2) 在现代机器上,这种类型的优化仍然是一种值得的编程习惯吗?(可能预取的处理方式与以前不同?这些类型的优化通常很有用。然而,这通常是在您编写程序、分析程序并确定程序将从这些微优化中受益之后进行的
此外,许多现代编译器都有,这可以使您不必为了性能目的而扭曲代码。您希望将代码设置为尽可能少地分支,并在分支时向后分支。如果要做到这一点,更可靠的方法是始终执行常见的操作,然后测试异常: 做一件事; 如果(测试)做B 当然,这必须安排好,如果B发生,A所做的任何事情都会被B逆转 Zen编程的目的是试图完全消除If语句。例如,不需要循环10次(这需要一个退出条件测试),只需编写10次相同的语句,瞧!,没有if语句。另一个例子是,如果正在循环列表,则使用sentinel退出循环,而不是测试索引值
如果您使用的是C语言,那么很难让编译器执行您想要的操作。在IF语句中放在第一位或第二位对编译结果没有影响。请注意,使用正确的编译器选项至关重要。例如,Visual C++中使用/O2-(优化速度)对编译效率有很大的影响。然而,大部分情况下,编译器优化会解决这个问题。