优化是危险的吗?

时间:2013-12-07 09:03:00

标签: algorithm optimization

我已经在堆栈溢出中的一个问题的注释部分的某处读到了:

始终开始未经优化的编码。 如果它符合要求那么它很好, 否则编写优化版本。 检查优化代码是否符合要求,是否符合要求,保留它但保留未优化版本或粘贴未优化版本作为注释。 如果优化版本不符合要求,请将其删除并坚持使用未经优化的版本。

^这种编程有一个术语吗?这是一个好的或坏的编程实践

优化是否危险?我能想到的唯一原因是它可能会产生不必要的复杂性,从而导致错误。还有别的吗?

当一个人应该优化与否时,是否有一般规则可以遵循?

5 个答案:

答案 0 :(得分:3)

优化代码需要花费时间,开发人员可以使用这些代码来添加新功能或改进产品。由于开发的最终目标不是代码,而是使用它构建的产品,因此在优化上花费时间应该与当时可以完成的其他用途相平衡。

当由于需求的变化而花费在不会在产品中结束的代码上时,这是浪费。如果从头开始执行优化,您可能还会花费大量时间来优化代码的一部分,这只会对应用程序花费的总时间产生轻微影响。

相反,您应该等到明确了解应用程序是什么以及在花费太多精力进行优化之前的瓶颈是什么。然后,您将拥有大量的单元测试和用例,这些测试和用例将使您可以放心地优化您不会破坏应用程序,并且只需要将精力投入到真正值得优化的部件上。 / p>

与工程一样,优化是您的权衡。如果你介意你的资源(时间,金钱......),你一定要确保在做这件事之前要付出代价。

答案 1 :(得分:2)

如果您认为不应该优化(由您的编译器)破坏您的代码,

  • 您的代码未遵循语言标准或
  • 你的编译器坏了,你应该升级它。

语言标准的理解非常复杂(特别是因为没有指定所有内容,有些内容明确地未指定或特定于实现)。阅读undefined behavior

编译器在实践中经过了大量测试,你应该首先怀疑自己的代码,并且只有在确保你的代码是正确的(并且完全符合标准)之后才会怀疑编译器(换句话说,编译器优化错误 - 其中生成的代码错误 - 在实践中非常罕见。)

请务必将编译器升级到最新版本。对于海湾合作委员会,今天(2013年12月)4.8.2;如果您使用的是4.4或3.6 GCC编译器,请不要责怪GCC,这些古老的版本不再维护了!

实际上,在开发代码时启用所有警告和调试信息(例如至少使用gcc -Wall -g编译,甚至可能使用-Wextra编译)。当您确定代码的质量时,请使用优化和警告(例如gcc -Wall -g -O2)对其进行编译并对其进行大量测试。

在实践中, profile 执行测试并(如果可能)将精力集中在热门代码(占用大部分CPU时间的代码)上。

答案 2 :(得分:2)

通常,优化的代码更复杂,更难以纠正。早期优化代码通常也会产生相反的效果(仅仅因为您可能会花时间优化不能在整体性能方面提供任何实际改进的东西)。

因此,您所询问的指导原则归结为:

  • 编写更易于编写并验证其正确的代码
  • 在有意义的情况下优化代码

无论运行速度有多快,错误代码都不是优化代码。

答案 3 :(得分:2)

在优化之前始终进行分析。如果少量代码占用了大部分执行时间,并且您可以从分析结果中证明这一点,请考虑编写,测试,重新配置,维护以及让其他人继承此增加的复杂性的编程工作。完成此操作后,将代码恢复到为运行时优化之前,并将其优化为可读性。只是不要这样做。说真的,除非超过90%的执行都花费在一个功能上,否则不值得努力。

请记住,消耗90%运行时间的代码加速10倍会使总运行时间减少约5倍。这个慢速功能的无限加速仍然只能将你的整个程序加速10倍。如果你希望速度提升超过一个数量级(这是我开始考虑优化的门槛) ,您将需要改变解决问题的方式,这种改变意味着重新思考程序的体系结构。如果幸运的话,可能就像用优先级队列替换队列一样简单。很可能你不会幸运。对不起,答案很惨淡。

答案 4 :(得分:1)

过早优化是所有邪恶的根源......但有时你没有真正的选择,请参阅ARM设备上的音频编解码器实现,在这种情况下,您需要从DSP ARM组件扩展中受益(如{ {1}})只能映射到具有多行指令的C代码(效率非常低),编译器无法在那里做得很好,因此您需要优化代码内联汇编。 在这种情况下,您可能会首先编写一个“非优化代码”,但考虑到优化...因此,当您添加优化时,您将不需要过多地更改代码。

您知道需要优化代码的另一种情况是,您将为嵌入式设备编写信号处理功能(相关,卷积,fft)。在这种情况下,您将不得不进行算法优化(选择最佳方法来解决问题,选择正确的近似值)和代码优化(例如正确使用管道),最好知道您将要优化在开始之前的代码(特别是在编码之前可以在纸上执行的算法,并且可以单独测试)。