我举两个例子:
if (i mod [number] == 0) do thing; else do other thing
以及
if (i mod [number] != 0) do other thing; else do thing
这两个示例的CPU周期是否相等?
1aaf6o9v1#
在C语言中,你不写CPU指令。你写的是抽象C机器的指令。然后编译器将你的C代码转换成CPU代码,并且它可以自由地生成任何CPU代码,只要它保持你的C程序的可观察行为。由于两个代码片段是等价的,两者都可以生成相同的汇编代码。不要为了性能而反转if条件,因为这是徒劳的。你可以在这里做的一个真实的的优化是使用[[likely]提示编译器。大多数编译器都有自己的C非标准等价物。要知道,这种优化并不像你想象的那样“保存周期”。相反,它可以在某些模式使用场景中帮助pipeline branch prediction。如果你想进入兔子洞,优化是一个非常深入和有趣的领域。它这并不像看起来那么简单。另外,如果这不是热门代码,任何优化在这里实际上都不会有任何效果。所以总是第一个配置文件配置文件。首先写干净的代码,然后分析,如果你发现问题,然后根据分析结果进行优化,不要做premature optimizations。
[[likely]
1条答案
按热度按时间1aaf6o9v1#
在C语言中,你不写CPU指令。你写的是抽象C机器的指令。然后编译器将你的C代码转换成CPU代码,并且它可以自由地生成任何CPU代码,只要它保持你的C程序的可观察行为。由于两个代码片段是等价的,两者都可以生成相同的汇编代码。不要为了性能而反转if条件,因为这是徒劳的。
你可以在这里做的一个真实的的优化是使用
[[likely]
提示编译器。大多数编译器都有自己的C非标准等价物。要知道,这种优化并不像你想象的那样“保存周期”。相反,它可以在某些模式使用场景中帮助pipeline branch prediction。如果你想进入兔子洞,优化是一个非常深入和有趣的领域。它这并不像看起来那么简单。另外,如果这不是热门代码,任何优化在这里实际上都不会有任何效果。所以总是第一个配置文件配置文件。首先写干净的代码,然后分析,如果你发现问题,然后根据分析结果进行优化,不要做premature optimizations。