假设我有这样的代码,将其称为版本1:
while (some_condition) {
// .. work that may trigger rare_condition ...
if (rare_condition) {
// .. rare work here ..
continue;
}
// .. work that may trigger rare_condition ...
if (rare_condition) {
// .. rare work here ..
continue;
}
// .. more work
}
假设这两种情况下的"稀有作品"是相同的.我们可以等价地编写版本2:
while (some_condition) {
// .. work that may trigger rare_condition ...
if (rare_condition) {
goto rare_work;
}
// .. work that may trigger rare_condition ...
if (rare_condition) {
goto rare_work;
}
// .. more work
continue;
rare_work:
// .. rare work here ..
}
编译器通常应该足够智能,以使if判断结果直接跳到rare_work
,而不是跳到包含跳到rare_work
的块.编译器甚至可以为我们将版本1转换为版本2,因为它减少了汇编的总量,增加了适合指令高速缓存的机会.
我的问题是:如果指令缓存是not个问题,有任何理由期望其中之一的性能更好吗?这是假设我们关心低级微优化,并愿意在必要时用ASM编写代码,以便强制获得一个或另一个版本.我意识到端口可用性之类的事情可能会根据工作说明的实际内容而发生变化,我只是想知道在进行这样的分析之前是否有任何高级理由期望有所不同.