编程没有跳跃

时间:2010-11-29 10:30:36

标签: c optimization

我尝试在没有跳跃的情况下找到有关编程的文章,书籍或任何内容(x86 arch)。我知道通常这是不可能的,但我尽量避免跳跃,但gcc即使使用内联函数也会多次使用跳转。仅在汇编中进行编码是某种解决方案,但在 C 中编写相当于1000行的内容就像是我眼中的地狱派对......

5 个答案:

答案 0 :(得分:7)

除非你的跳跃是随机的,否则分支预测应该消除大部分涉及的开销。

我会投入更多精力优化内存访问模式,以改善位置并减少缓存未命中。目前,内存延迟是性能的主要瓶颈。

另一个好的方向是改善并行性(使用矢量化SIMD指令,如果可能的话,使用多个核心)。

答案 1 :(得分:2)

我想你可能意味着分支。在C中,有一些用于加速某些操作的麻烦技巧

看一下黑客攻击:

http://www-graphics.stanford.edu/~seander/bithacks.html

答案 2 :(得分:2)

仅优化性能关键代码,并且只有在您确实知道它对性能至关重要时才会优化。不要试图优化跳转只是因为你读它们会影响性能。一切都会导致性能下降,最快的代码就是什么都不做的代码。还有其他事情比跳跃更糟糕。

如果您将在生成的代码中显示跳转的特定示例,则可能会有某种方法可以避免它,但是您显示的代码更可能仍然包含更严重的问题。

如何避免分支的一种特殊方法是使用“条件移动”指令。它们可以用于例如计算最大值或最小值。如果您允许编译器使用SSE体系结构,它假定CPU还支持CMOV / FCOMI / FCOMIP / FUCOMI / FUCOMIP指令并将使用它们(注意:有时使编译器执行您想要的操作可能很棘手,请参阅例如this gamedev.net discussion)。

答案 3 :(得分:1)

在没有跳跃的情况下进行编码并不是不可能,但尝试它似乎毫无意义。

最后,如果您需要多次执行某些操作,那么您的选择是:

  • 循环展开(即重复代码而不是循环)。
  • 以某种方式获取指令指针不止一次访问相同的代码。

第一种方法需要提前知道迭代次数并且不能扩展,第二种方法需要某种跳跃。

答案 4 :(得分:0)

不知道你的代码是什么样的,很难给出任何建议。但我会尝试一下。

在开始优化之前,请运行分析工具以找到问题区域。优化后,再次运行性能分析工具,看看是否真的更快。

实际上很难删除分支,但你可以通过循环展开来最小化它们。

有人提到了条件移动指令,ARM架构上有很多条件指令,但是如果它们没有被执行,它们将转换为NOP并且每个都需要一个周期。不确定它们如何在x86上运行。实际上,使用简单的分支可能会慢一些,具体取决于管道的长度。

在删除分支之前,您还可以尝试许多其他优化技巧。