在教科书之后,每当我尝试优化代码时,我都会测量性能。然而,有时候,性能提升相当小,我不能果断地决定是否应该实现这种优化。
例如,在某些情况下修复时间缩短了100ms到90ms的平均响应时间,我应该实现该修复吗?如果缩短200ms到190ms怎么办?在得出总体上有益的结论之前,我应该尝试多少条件?
我想这是不可能给出一个直截了当的答案,因为它取决于太多的东西,但是我应该遵循一个好的经验法则吗?有没有指南/最佳实践?
编辑:谢谢你的答案!我想这个故事的寓意是,没有简单的方法来判断你是否应该,但是有一些指导方针可以帮助这个过程。你应该考虑的事情,你不应该做的事情等等。这个特定的时间我最终实现修复,即使它在20-30行代码中生成了几行代码。因为我们的应用。在性能上非常重要,在各种现实案例中,这一点始终保持10%的增长。答案 0 :(得分:7)
我认为经验法则(至少对我而言)是双重的:
关于上述第1点:通过建议您的软件的最终用户可能“注意到”10ms的差异,我并不是说他们实际上会明显看到差异。但是,如果您的应用程序在具有数百万个连接的服务器上运行,并且每次小的速度增加都会对服务器造成很大负担,这对运行服务器的客户端来说可能很重要。或者,如果您的应用程序执行极其时间关键的工作,这是另一种情况,即10分钟加速的结果可能会引人注意,即使加速本身不是。< / p>
答案 1 :(得分:7)
对你的问题唯一明智的做法是“当利益足够大以保证你投入探索,实施和测试优化的时候。”
“利益足够大”是非常主观的。如果您进行此更改,您或您的雇主可以销售更多的软件单元吗?您的用户群会注意到吗?是否可以为您提供个人满足感,以获得最快的代码?哪些或类似的问题适用只有你才能知道。
总的来说,我写的大部分软件(在20多年的职业生涯中)已经“足够快”开箱即用,而我关心优化的代码本身就是最终用户的瓶颈:查询需要很长时间,滚动速度太慢,等等。
答案 2 :(得分:6)
Donald Knuth就优化发表了以下两条声明:
“我们应该忘记小事 效率,约占97% 时间:过早优化是 万恶之源“[2]
和
“在已建立的工程中 纪律改善了12%,很容易 获得,从未被认为是边缘的 我相信同样的观点 应以软件为准 工程“[5]
答案 3 :(得分:3)
答案 4 :(得分:3)
您应该将优化工作集中在占运行时最多的代码部分。如果一段特定的代码占总运行时间的80%,那么优化它以减少5%的时间将产生与将其余代码的时间减少20%相同的影响。
通常,优化会降低代码的可读性(并非总是如此,但通常都是如此)。因此,在确定存在问题之前,应避免优化。
答案 5 :(得分:2)
如果它加速你的程序,为什么不实现它?您已经通过创建新实现来完成工作,因此您不会通过应用新实现来完成额外的工作。
除非代码更难理解。
此外,100 ms至90 ms的性能提升10%。不应轻率增加10%。
真正的问题是,如果首先只运行100毫秒,那么尝试优化它的重点是什么?
答案 6 :(得分:2)
只要它足够快 ,那么您就不需要再进行优化了。但是,如果是这样的话,你甚至不会打扰分析......
答案 7 :(得分:2)
如果性能提升很小,请考虑其他因素:可维护性,进行更改的风险,可理解性等。如果它降低了维护或理解代码的能力,则可能不值得这样做。如果它改善了这些属性,那么实施更改就更有理由了。
答案 8 :(得分:1)
在大多数情况下,您的时间比计算机更有价值。如果你认为你需要花半个小时的时间才能弄清楚代码后面会做什么(比如说它有什么错误),并且它只能保存你几秒钟,那么你就会遭受净损失。
答案 9 :(得分:1)
这在很大程度上取决于使用场景。我在这里假设有问题的代码已被分析,因此它被认为是瓶颈 - 即。不只是“这可能更快”,但“如果速度更快,该程序将给予结果/完成更快”。在不是这种情况的情况下 - 例如。如果你花99%的时间等待更多的数据来通过以太网连接 - 那么你应该关心正确性而不是优化速度。
对我个人来说,最大的烦恼之一就是找到可能最初属于一个类别然后又陷入另一个类别的软件,但是没有人回去做必要的优化。直到最近,Javascript性能才是一个很好的例子。故事的道德是:不要只决定一次;根据情况需要重新审视这个问题。