我应该查看java编译器生成的字节码吗?

问题描述 投票:0回答:4

No

  • JIT 编译器可能会将字节码“转换”成完全不同的东西。
  • 它会导致你进行过早的优化。

Yes

  • 你不知道哪个方法会被JIT编译,所以最好都优化它们。
  • 它会让你成为一名更好的Java程序员。

我是在不太了解的情况下才问的(显然),所以请随意重定向到 JIT 超链接。

java jvm bytecode jit
4个回答
17
投票

是的,但在某种程度上——这是一个很好的教育机会,可以了解幕后发生的事情,但可能应该适度进行。

这可能是一件好事,因为查看字节码可能有助于理解 Java 源代码如何编译成 Java 字节码。此外,它可能会给出一些关于编译器将执行哪种优化的想法,以及可能对编译器可以执行的优化量的一些限制。

例如,如果执行字符串连接,

javac
会将连接优化为使用
StringBuilder
并执行
append
方法来连接
String

但是,如果在循环中执行字符串连接,则可能会在每次迭代时实例化一个新的

StringBuilder
,与在循环外手动实例化
StringBuilder
并仅在循环内执行
append
相比,可能会导致性能下降。循环。

关于JIT的问题。即时编译将是特定于 JVM 实现的,因此当字节码转换为本机代码时,要找出字节码实际发生了什么并不容易,而且我们无法分辨哪些部分正在被 JITted(至少没有一些特定于 JVM 的工具来查看正在执行哪种 JIT 编译——我不知道这方面的任何细节,所以我只是推测。)

也就是说,JVM 无论如何都会执行字节码,它的执行方式对开发人员来说或多或少是不透明的,而且还是 JVM 特定的。可能存在一些性能技巧,一个 JVM 执行而另一个 JVM 不执行。

当涉及到查看生成的字节码的问题时,归根结底是了解源代码在编译为字节码时实际发生了什么。能够查看编译器执行的优化类型,但也了解编译器执行优化的方式存在限制。

尽管如此,我认为沉迷于字节码生成并尝试编写能够生成最优化字节码的程序并不是一个好主意。更重要的是编写可供他人阅读和维护的 Java 源代码。


4
投票

这完全取决于您想要做什么。 如果您正在尝试优化方法/模块,那么查看字节代码将是浪费您的时间。 始终首先进行分析以找出瓶颈所在,然后优化瓶颈。 如果您的瓶颈看起来尽可能严格并且您需要使其更快,您可能别无选择,只能用本机代码重写它并与 JNI 接口。

尝试优化生成的字节码没有什么帮助,因为 JIT 编译器会做很多工作,而你不太了解它到底在做什么。


1
投票

我不这么认为。除了必须调试 javac 编译器或想知道作为一件感兴趣的事情之外,我想不出有人会关心生成什么字节码的充分理由。

了解字节码并不会让你成为一名更好的 Java 程序员,就像了解内燃机如何工作并不会让你成为一名更好的司机一样。

从抽象的角度思考。在尝试计算行星轨道时,您不需要了解夸克或原子的行为。要成为一名优秀的 Java 程序员,您可能应该学习……嗯……Java。是的,Java,就是这样:-)


0
投票

除非您正在开发某种类型的高容量服务器,否则您可能永远不需要检查字节码,除非出于好奇。 遵循组织中可接受的编码实践的源代码将为大多数应用程序提供充足的性能。

在对应用程序进行负载测试后发现问题之前,不要担心性能(或者整个客户服务部门会因为那个需要“永远”加载的屏幕而对你进行私刑)。 然后,解决瓶颈并保留其余代码。

字节码需要适度的学习曲线才能理解。 当然,了解更多总没有坏处,但实用主义建议推迟到有必要时再了解。 (如果那一刻到来,我建议找人来指导你。)

© www.soinside.com 2019 - 2024. All rights reserved.