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

时间:2014-12-19 10:10:44

标签: java performance assembly

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

因为有很多方法可以考虑效率,所以我想首先如何获取自己代码的汇编代码并停在代码中的正确位置?(让& #39;假设您有500行代码,并且您对450行到460行感兴趣。我不确定这是否已经是IDE中的功能,如果是这样,我怎么能找到这样的功能? (=这些东西的命名是什么,以便我可以在我自己的IDE中找到它,如果它具有此功能)。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

  1. 写下程序的一部分。
  2. 确定它确实太慢了。
  3. 识别并修理瓶颈。
  4. 转到#1。
  5. 为了识别瓶颈,我通常从JVisualVM开始,并在必要时使用更多低级工具:

    在99%的情况下,问题是算法速度慢,数据结构错误,磁盘访问效率低或者像调试日志遗留下来一样愚蠢。较少的微优化,如避免不必要的复制或内存分配将有所帮助。在极少数情况下,如果其他一切都失败了,你需要从一些紧凑的循环中挤出几个循环,那么查看生成的程序集可能是值得的。在这种情况下,PrintAssembly可能会有用。您希望从最有可能帮助您的工具开始。

答案 1 :(得分:2)

要获取JVM的汇编代码,您可以使用PrintAssembly参数。它提供了带有注释的可读代码,指向java源代码中的行。因此,您可以清楚地了解Java代码的编译方式。但我认为,查看处理器指令很难理解瓶颈。为此,我使用了VisualVM和JProfiler。