java - 如何衡量效率(特别是 : assembly code) for java programs?

标签 java performance assembly

我问过一些问题,而这些问题的答案往往与效率有关。与其继续问这些类型的问题,我宁愿事先看看效率。然而,当然有许多不同类型的效率。代码的行数,汇编,写的时间,电脑执行的时间。我可能错过了更多看待它的方式。

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

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

最佳答案

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

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

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

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

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

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

关于java - 如何衡量效率(特别是 : assembly code) for java programs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27563731/

相关文章:

java - InputStream - 在什么时候下载数据

java - 在jsp中发送电子邮件确认链接

python - 如何在分区算法中检索子集?

linux - int 0x80 是 linux 汇编程序中唯一使用的中断号吗?

java - 为什么 Class.class.getResourceAsStream(String) 总是返回 null?

java - Box2D静态体碰撞性能问题

java nio 和 FileInputStream

assembly - 为什么 8 位 MUL 组合成 AX,但 16 位和 32 位 MUL 将结果拆分为 [E]DX :[E]AX?

visual-studio-2010 - 通过注入(inject)的 Delphi dll 启用 __fastcall 来 Hook 在 MSVC++ 上制作的应用程序

java - 如何提高使用 mapreduce 分析日志文件的性能