所以我一直在读乔恩·斯托克斯的“机器里面”。这是一本很棒的书,它让我思考编程对处理器的影响。
给定CPU中的分支单元和涉及过程调用(如果IsTodayAHoliday(现在)>0)的复杂条件语句,在IF语句之前将该过程调用的结果放入变量中会更快吗?从静态和动态分支预测的角度来看,在分支单元进行评估之前有决策值使得预测算法能够完美地执行,这是合乎逻辑的。这是真的吗?
发布于 2011-06-17 08:50:20
我能想到的最好的答案是,我一遍又一遍地看到:
Don't prematurely optimize.
更长的版本是:编译器(想必)比您更了解目标体系结构。您应该编写正确和可维护的代码,如果底层硬件发生了变化,您就不希望代码与特定的硬件绑定得太紧。
对于某些体系结构(例如Cell/BE),在漏掉分支预测时,管道失速的代价远远高于计算、准备两个分支并根据计算结果进行无条件跳变的代价。但我认为在其他硬件上这样做是完全错误的。
此外,根据我在编译器优化方面的经验,更简单、更容易识别的模式更有可能被优化(考虑到XOR交换与临时变量交换)。
希望这能有所帮助。
发布于 2011-06-17 09:24:31
如果你说的是:
if (isTodayAHoliday(now) > 0) { ... }
和:
int holiday = isTodayAHoliday(now);
if (holiday > 0) { ... }
答案很简单:机器代码绝对没有区别。
请记住,CPU对函数或表达式一无所知。分支指令不接受函数或表达式,它需要一个值来比较零(或其他什么)。不管你用高级语言来表达它,编译器都必须发出代码来计算这个值,把它放在寄存器中,然后得到分支指令。
发布于 2011-06-17 08:46:12
马比,但你说的是微观优化。这通常最好由编译器来处理。
https://softwareengineering.stackexchange.com/questions/84898
复制相似问题