基于证据的 Java 性能调优方法

唐纳德克努特经常被引用说:

“程序员浪费了大量的时间来考虑或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记效率低下,比如说 97%的时间 :过早的优化是所有邪恶的根源。然而,我们不应该在那个关键的 3%中放弃我们的机会。“

资源

考虑到 sage 建议,这是优化程序的推荐程序:

  1. 首先,设计和编码你的程序或库,重点是简单性和正确性。首先,不要在性能上花费太多精力。

  2. 使其处于工作状态,并(理想情况下)为代码库的关键部分开发单元测试。

  3. 开发应用程序级性能基准。基准测试应该涵盖应用程序的性能关键方面,并且应该执行一系列典型的应用程序将在生产中使用的任务。

  4. 衡量表现。

  5. 将测量的性能与应用程序需要的速度标准进行比较。 (避免不切实际,难以实现或无法量化的标准,例如尽快。)

  6. 如果你符合标准,请停止。你的工作已经完成。 (任何进一步的努力可能都是浪费时间。)

  7. 在运行性能基准测试时对应用程序进行概要分析。

  8. 检查分析结果并选择最大(未经优化)的性能热点; 即应用程序似乎花费最多时间的代码部分。

  9. 分析热点代码部分以试图理解它为什么是瓶颈,并想办法让它更快。

  10. 将其实现为建议的代码更改,测试和调试。

  11. 重新运行基准测试以查看代码更改是否提高了性能:

    • 如果是,则返回步骤 4。
    • 如果否,则放弃更改并返回步骤 9.如果你没有取得进展,请选择一个不同的热点供你注意。

最终,你将达到应用程序速度足够快的程度,或者你已经考虑了所有重要的热点。此时你需要停止这种方法。如果一段代码消耗(比如说)总时间的 1%,那么即使 50%的改进也只会使应用程序总体上提高 0.5%。

显然,有一点超出热点优化是浪费精力。如果你达到这一点,你需要采取更激进的方法。例如:

  • 查看核心算法的算法复杂性。
  • 如果应用程序花费大量时间进行垃圾回收,请寻找降低对象创建速率的方法。
  • 如果应用程序的关键部分是 CPU 密集型和单线程,请寻找并行机会。
  • 如果应用程序已经是多线程的,请查找并发瓶颈。

但只要有可能,依靠工具和测量而不是直觉来指导你的优化工作。