【问题标题】:Should I optimize my code myself or let the compiler/gcc to do it我应该自己优化我的代码还是让编译器/gcc 来做
【发布时间】:2017-04-05 01:02:22
【问题描述】:

我正在编写一个 c 代码,我想知道如果让简单的操作(如乘法)更 CPU 友好,是否会有所不同,并且代码更快。比如替换这行代码:

 y = x * 15;

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

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

【问题讨论】:

  • 你真的不知道。我猜不,它不会优化这个,但我可能是错的。只需编写您的代码,对其进行分析,然后优化真正拖慢您速度的部分。过早的优化会导致很多问题。
  • 事实证明,是的,gcc 6.3 对此进行了优化(如果您通过 -O2):godbolt.org/g/7ax85U
  • 始终:首先编写有效的代码并编写测试以测试您的代码(及其性能)然后优化。这保证您的代码仍然可以正确执行,并且您的优化实际上会提高性能。
  • 一般来说 1) 编写易于人类阅读/理解的代码 2) 优化在算法的逻辑中最有用,而不是像您建议的代码那样进行局部优化
  • @user3629249 你的第一点非常好:高级语言就是为了做到这一点——编写易于理解的代码。

标签: c gcc compilation


【解决方案1】:

答案分为两部分:

  1. 不,除非您正在编写一个非常专业的函数(例如,必须在 20 个时钟内执行的信号处理函数),否则您不应该优化;把它留给编译器。一般来说,你的工作是编写可读的代码,编译器会(根据它的能力对其进行优化)。请注意,不同处理器的优化会有所不同,因为它们的硬件(计算能力)可能非常不同。例如,在带有常规移位器的处理器上,移位 N 指令(如您的代码中的指令)可能需要 N 个时钟,但在带有硬件桶形移位器的处理器上需要一个时钟(或更少)。
  2. 是的,大多数现代优化编译器将在没有显式优化选项的情况下进行优化(例如,在适当的情况下通过移位替换乘法)。

总结,只在极少数情况下优化,当你已经知道编译器没有做好,这是一个必须解决的问题,你知道如何比编译器做得更好,从而增加了维护成本是值得的。

【讨论】:

    【解决方案2】:

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

    此外,除非您正在优化的代码将被大量使用,即连续数百万次,否则优化代码的工作所花费的时间将超过您实现的节省。

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

    请注意,您的优化是针对 特定 乘数的 - 您使用它的任何其他操作数都会产生不同的结果。因为它不能一概而论,所以在所有情况下,任何编译器都不太可能进行 this 优化 - 只是查看代码而不知道它将在什么处理器架构上运行,我可以'不说它是否会更快。

    【讨论】:

    • 为什么投反对票?这个答案是否不准确或具有误导性?
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2015-01-31
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多