Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 设置条件语句以利用指令预取(现代x86)_Optimization_Assembly_X86 - Fatal编程技术网

Optimization 设置条件语句以利用指令预取(现代x86)

Optimization 设置条件语句以利用指令预取(现代x86),optimization,assembly,x86,Optimization,Assembly,X86,我最近读了Michael Abrash的《汇编语言的禅宗》(1990年)一书,读了一节关于指令预取如何不总是有利的,比如发生分支(跳转)的情况。这是因为预取的所有指令不再是要执行的指令,因此必须提取更多指令 这让我想起了另一本旧书《游戏编程大师的诀窍》中的一个优化。在这本书中,安德烈·拉莫特建议,在设置条件语句时,应将最频繁(或预期)的路径放在第一位 例如: if (booleanThatIsMostLikelyToBeTrue) { // ...expected code // a

我最近读了Michael Abrash的《汇编语言的禅宗》(1990年)一书,读了一节关于指令预取如何不总是有利的,比如发生分支(跳转)的情况。这是因为预取的所有指令不再是要执行的指令,因此必须提取更多指令

这让我想起了另一本旧书《游戏编程大师的诀窍》中的一个优化。在这本书中,安德烈·拉莫特建议,在设置条件语句时,应将最频繁(或预期)的路径放在第一位

例如:

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-(优化速度)对编译效率有很大的影响。然而,大部分情况下,编译器优化会解决这个问题。