我正试图在一系列循环很多次的计算中尽可能多地节省时间。当变量S = 1
和不等于1时,计算有两种情况。变量S
在最开始时设置为常量#define
。代码。
所以,现在,在进行适当的计算之前,我有if
检查S
的值。如果我使用#if
代替,并让预处理器选择将提前使用的部分代码,因为S
已经可用,我会获得任何性能提升吗?我没有看到任何增长,但我被告知这绝对是可行的方法。
我仍然觉得在实际代码中使用预处理器代码很奇怪,但是如果实际上它会有所帮助,那么我对它没有任何问题。在这种情况下使用#if
是否有益?
答案 0 :(得分:5)
如果在if
内有一个没有副作用的常量表达式,我希望合理的编译器能够生成不会对计算感到烦恼的代码。所以我希望没有区别。您可以检查编译器的汇编输出以确认这一点。
我能想到的唯一使用#if
的情况是,如果某个代码块对某个配置根本没有意义(或者不会编译)。我同意对其他事情看起来很奇怪。另一方面,拥有一个始终为true或始终为false的if
语句对我来说也有点奇怪。然而,这是一个主观的呼吁。
答案 1 :(得分:0)
如果你的编译器有任何好处,你可能会发现它没有任何区别。任何体面的优化器都会看到你正在检查一个常量,并且实际上不会为if
检查生成任何代码。
我有点担心你有人向你投掷(很可能是BS)优化请求。 That way lies the road to Hell。如果你认为性能非常重要以至于值得将大量额外的程序员时间投入到改进中,那么正确的方法就是分析常规。然后,应重新配置任何使代码难以阅读的所谓优化,以证明性能已经提高到足以使其值得。
此外,在C中可能很难避免,但您应该尽量避免使用预处理器。因为它的实现机制与普通的编译代码差别很大,所以它往往会让你的源代码更难理解。我知道你的迭代时间不会减少3纳秒,但它可以节省数周的维护程序员时间。这也不便宜。
答案 2 :(得分:0)
好吧,它会消除不需要的代码(因为预处理器只是将其删除并且没有编译成二进制代码),但这只有在你真正处于二进制大小或cpu周期(即在微处理器或嵌入式设备上)。在普通的桌面应用程序?它不会受到伤害,但它也不会产生任何影响,因为它只是代码中的一个跳转语句。
答案 3 :(得分:-1)
预处理器将处理#if指令,这意味着输出代码将只包含单个必需的行。这将导致编译时间缩短,但执行时间最短。
另一方面,使用if关键字将分支指令放在输出机器代码中,这需要比汇编中的零分支指令执行更长的时间。
如果您多次执行此“if”,则通过使用#if指令可以节省更多周期。
正如之前的答案所提到的,编译器很可能会为您优化这一点。