我尝试在没有跳跃的情况下找到有关编程的文章,书籍或任何内容(x86 arch)。我知道通常这是不可能的,但我尽量避免跳跃,但gcc即使使用内联函数也会多次使用跳转。仅在汇编中进行编码是某种解决方案,但在 C 中编写相当于1000行的内容就像是我眼中的地狱派对......
答案 0 :(得分:7)
除非你的跳跃是随机的,否则分支预测应该消除大部分涉及的开销。
我会投入更多精力优化内存访问模式,以改善位置并减少缓存未命中。目前,内存延迟是性能的主要瓶颈。
另一个好的方向是改善并行性(使用矢量化SIMD指令,如果可能的话,使用多个核心)。
答案 1 :(得分:2)
答案 2 :(得分:2)
仅优化性能关键代码,并且只有在您确实知道它对性能至关重要时才会优化。不要试图优化跳转只是因为你读它们会影响性能。一切都会导致性能下降,最快的代码就是什么都不做的代码。还有其他事情比跳跃更糟糕。
如果您将在生成的代码中显示跳转的特定示例,则可能会有某种方法可以避免它,但是您显示的代码更可能仍然包含更严重的问题。
如何避免分支的一种特殊方法是使用“条件移动”指令。它们可以用于例如计算最大值或最小值。如果您允许编译器使用SSE体系结构,它假定CPU还支持CMOV / FCOMI / FCOMIP / FUCOMI / FUCOMIP指令并将使用它们(注意:有时使编译器执行您想要的操作可能很棘手,请参阅例如this gamedev.net discussion)。
答案 3 :(得分:1)
在没有跳跃的情况下进行编码并不是不可能,但尝试它似乎毫无意义。
最后,如果您需要多次执行某些操作,那么您的选择是:
第一种方法需要提前知道迭代次数并且不能扩展,第二种方法需要某种跳跃。
答案 4 :(得分:0)
不知道你的代码是什么样的,很难给出任何建议。但我会尝试一下。
在开始优化之前,请运行分析工具以找到问题区域。优化后,再次运行性能分析工具,看看是否真的更快。
实际上很难删除分支,但你可以通过循环展开来最小化它们。
有人提到了条件移动指令,ARM架构上有很多条件指令,但是如果它们没有被执行,它们将转换为NOP并且每个都需要一个周期。不确定它们如何在x86上运行。实际上,使用简单的分支可能会慢一些,具体取决于管道的长度。
在删除分支之前,您还可以尝试许多其他优化技巧。