优化代码速度/如何最佳优化?
在优化之前,您需要做的第一件事是确保您的代码有许多自动化测试,并且测试覆盖率很高。优化代码(或任何其他类型的修改)可能会破坏某些功能,而自动化测试可能会(并且希望)捕获到这些问题。
接下来,您需要确保您的代码是模块化的。重复代码和其他导致代码非模块化的属性会阻止对代码瓶颈进行清晰的性能分析。
在更改代码以“优化”它之前和之后,重要的是要 使用好的软件性能分析器对代码进行性能分析。有许多 性能分析工具。性能分析将有助于显示哪些代码运行时间不长,因此最好不要在其中投入大量的优化工作。应该首先优化最耗时的任务。
需要一些专业知识才能了解如何正确分析性能分析器给出的结果,以及查看需要优化的内容。例如,一些 I/O 密集型例程可能看起来很耗时,但实际上这种时间无法有效地消除,因为 I/O 量很小(但仍然相对耗时)。我认为进一步讨论性能分析的这一方面与本文的任务无关,因此我不会在这里讨论它。
最后,让某人审查代码并对其中发现的速度瓶颈进行一般性评论是一个好主意。引用 Eric Raymond 在 "大教堂与集市" 中的一句话:“只要有足够多的眼睛,所有 bug 都将变得浅显易懂”。
一位评论了本文初稿的人说,我没有足够重视性能分析,并说“性能分析是唯一有效的优化方法”。虽然我同意应该在优化之前进行性能分析,但我强烈反对性能分析是唯一优化方法的观点。
例如,有可能在尝试实现其他目标时意外地进行优化。有时,我通过更改代码来解决 Windows NT 上的堆栈溢出问题,从而提高了 Freecell Solver 的性能。此外,有时程序员可以意识到,以某种方式更改程序的某个方面将提高性能,而无需对代码进行性能分析。
最后,有时对代码进行性能分析(至少使用现有的有限工具)并不能告诉你很多信息。在我的一个项目中,在进行性能分析后,最耗时的函数占用了大约 15% 的时间,而其他最热门的候选者只占用了几个百分点。那么我应该在这里对什么进行性能分析呢?
因此,虽然性能分析很重要,但它并不是唯一有效的优化方法,有时需要采用不同的方法。