我应该自己优化我的代码还是让编译器/ gcc执行它

时间:2017-04-05 01:02:22

标签: c gcc compilation

我正在编写一个c代码,我想知道如果像乘法这样简单的操作,更多的CPU友好会带来任何差异,代码更快。例如,替换这行代码:

 y = x * 15;

 y = x << 4;
 y -= x;

编译器是否已经这样做了?我应该使用-O2选项才能实现吗?

2 个答案:

答案 0 :(得分:6)

答案分为两部分:

  1. 不,除非您正在编写一个非常专业的功能(例如必须在20个时钟内执行的信号处理功能),否则您不应该优化;把它留给编译器。一般来说,你的工作是编写可读代码,编译器将(它的功能优化它)。请注意,对于不同的处理器,优化将是不同的,因为它们的硬件(计算能力)可能非常不同。例如,N指令的移位(与代码中的指令一样)可能需要在具有常规移位器的处理器上使用N个时钟,但在具有硬件桶移位器的处理器上需要一个时钟(或更少)。
  2. 是的,大多数现代优化编译器都会优化(例如,在适当的情况下通过移位替换乘法),而无需明确的优化选项。
  3. 总结一下,只有在你已经知道编译器做得不好的极少数情况下才能优化,这是一个必须解决的问题,你知道如何做得比编译器更好,并由此带来更多的维护成本是值得的。

答案 1 :(得分:3)

现在手动优化代码几乎总是徒劳无功,尤其是在高级语言中。虽然C几乎是装配,但现代编译器内置的技巧比大多数人都知道的要多得多。

此外,除非你要优化的代码将被用于 很多 ,即数百万次紧​​密连续,优化代码的工作将比你实现的节省花费更多的时间。

话虽如此,看看你的代码是否明显更快的唯一方法是测试它:将每个版本放在一个紧密循环中并执行一百万次(或更多次),看看是否有明显的差异。

请注意,您的优化适用于特定的乘数 - 您使用它的任何其他操作数将产生不同的结果。因为它不能一概而论,所以这个优化很可能在任何情况下由任何编译器完成 - 只是查看代码而不知道它将运行什么处理器架构,我可以不知道它是否会更快。