1

我最近拿起了 Michael Abrash 的The Zen of Assembly Language(从 1990 年开始),并且正在阅读关于指令预取如何并不总是有利的部分,例如发生分支(跳转)的情况。这是因为所有预取的指令都不再是要执行的指令,因此必须取更多的指令。

这让我想起了另一本旧书Andre LaMothe 的Tricks of the Game Programming Gurus中的优化,其中他建议在设置条件语句时,将最频繁(或预期)的路径放在首位。

例如:

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

我的问题是:

1) LaMothe 的优化是否考虑到这一点?(我已经没有书了)

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

4

2 回答 2

1

这些类型的优化通常很有用。但是,这通常是您在编写程序、对其进行分析并确定程序将从这些微优化中受益之后执行的操作。

此外,许多现代编译器都有配置文件引导优化,这可以让您不必为了性能而扭曲代码。

于 2012-10-30T21:52:12.123 回答
1

您希望将代码设置为尽可能少地分支,并在分支时向后分支。执行该 IF 的更可靠方法是始终执行常见操作,然后测试异常:

做一个;如果(测试)做B;

当然,这必须安排好,如果 B 发生,A 所做的任何事情都会被 B 逆转。

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

如果您使用 C 语言工作,可能很难让编译器做您想做的事。在 IF 语句中放置第一个或第二个内容对编译结果没有影响。请注意,使用正确的编译器选项至关重要。例如,在 Visual C++ 中使用 /O2(优化速度)会大大提高编译效率。

于 2012-10-31T18:21:15.763 回答