gpt4 book ai didi

Java字节码 "excessive"的dup数算不算 "poor"码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:39 25 4
gpt4 key购买 nike

这是一个由两部分组成的问题,但对于单独的部分来说没有意义。字节码输出中的大量 dup 指令是否表示代码编写不当?其中 large 由所有字节码指令的一定百分比定义。此外,如何重写生成 dup 指令的代码?

最佳答案

我们是在谈论您正在分析的 javac 输出还是您自己的编译器/生成器?如果您从 javac 生成的内容的角度担心 Java 代码的质量 - 忘掉它吧。首先,javac 生成次优字节码并依赖 JVM/JIT 进行所有优化(非常好的选择)。但是字节码仍然可能比任何人可以快速想出的东西都要好得多。这类似于询问 C 编译器生成的汇编代码的质量。

如果您自己生成字节码,过多的 dup 可能看起来很糟糕,但它也可能不会对性能产生任何影响。请记住,字节码在目标机器上被翻译成程序集。 JVM 是堆栈机器,但如今大多数体系结构都是基于寄存器的。使用 dup 只是因为某些字节码指令具有破坏性(读取时从操作数堆栈弹出值)。寄存器不会发生这种情况——您可以根据需要多次读取它们。以下面的代码为例:

new java/lang/Object
dup
invokespecial java/lang/Object <init> ()V

dup 必须在此处使用,因为 invokespecial 弹出操作数堆栈的顶部。创建一个对象只是为了在调用构造函数后失去对它的引用听起来是个坏主意。但是在汇编中没有dup,没有数据拷贝和复制。您将只有一个指向 java/lang/Object 的 CPU 注册表。

换句话说,次优字节码被即时翻译成“更优”的程序集。只是……别打扰了。

关于Java字节码 "excessive"的dup数算不算 "poor"码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com