如何衡量java程序的效率(特别是:汇编代码)?

Joo*_*oop 5 java performance assembly

我问了一些问题,他们的答案经常在效率方面面对我.我宁愿预先考虑效率,而不是继续问这些类型的问题.然而,当然有许多不同类型的效率.代码,程序集中的行数,写入时间,计算机执行所需的时间.而且我可能会错过很多方法来看待它.

因为有很多方法可以查看效率,所以我想从如何获取自己代码的汇编代码并停在代码中的正确位置开始?(假设你有500行代码,你对450到460行感兴趣).我不确定这是否已经是IDE中的功能,如果是这样,我怎么能找到这样的功能?(=这些东西的命名是什么,以便我可以为我自己的IDE找到它,如果它有这个功能).

(在Stack Overflow上已经有很多关于效率的信息,我看了很多,但是我发现很难理解人们在分析代码时经常会开始的东西.他们是从研究代码开始的,然后组装还是他们只是使用IDE来找到最昂贵的方法并以这种方式改变它们?这是一个不好的问题,因为它当然取决于很多不同的因素,但我希望至少有一点点感觉为此,我认为这个问题的答案可能会有所帮助.)

Pio*_*zmo 4

您不太可能从分析 JVM 生成的汇编代码中获得任何有用的信息。如果您担心性能,那么这是错误的方法。您无法通过测量低级细节来推断高级性能。这对于第一个可以手动计算周期的程序可能很有效。如今,计算机变得更加复杂——尤其是当您使用 Java 等高级语言时。您需要考虑的事情包括:

  • 垃圾收集器暂停
  • 具有各种优化的 JIT
  • 多级指令和数据缓存。
  • 分支预测。

这些机制和它们之间的相互作用不是你可以轻易预测的。我知道只有一种明智的方法可以编写快速程序:

  1. 编写程序的一部分。
  2. 发现确实是太慢了。
  3. 识别并修复瓶颈。
  4. 转到#1。

为了识别瓶颈,我通常从 JVisualVM 开始,并在必要时使用一些更底层的工具:

在 99% 的情况下,问题是算法缓慢、数据结构错误、磁盘访问效率低下或诸如遗留调试日志之类的愚蠢问题。不太常见的微观优化(例如避免不必要的复制或内存分配)会有所帮助。在极少数情况下,如果其他一切都失败并且您需要从某个紧密循环中挤出几个周期,则可能值得查看生成的程序集。PrintAssembly在这种情况下可能会有用。您想从最有可能帮助您的工具开始。