iload_1、iload_2、iload_3和iload #index字节码的区别是什么?

4

iload #index与其他3字节代码有何不同。它们之间是否存在性能差异。

2个回答

5
iload #index与其他3字节代码的区别在于它使用了2个字节的字节码,而iload_1 _2 _3只使用了1个字节。通常情况下,它们之间没有性能差异,但有些性能调优指标是基于字节码字节数的,例如是否内联方法等。稍微长一点的方法可能会导致某些优化无法执行,例如内联方法的度量标准即使很少被调用也需要35个字节。如果代码使用iload#而不是iload_1,则意味着它比35个字节略长,这样就不会被内联。

那么我可以假设使用iload_1和iload #index访问变量时性能没有区别吗? - Ishwar Chandra
@IshwarChandra 除非扩大该方法会减少其优化。例如,35字节或更少的方法将被快速地内联。 - Peter Lawrey

1
当启动新线程时,JVM会为该线程创建一个新的堆栈,并且当线程调用Java方法时,虚拟机会在线程的Java堆栈上创建并推送一个新帧。 堆栈帧由三部分组成:局部变量、操作数堆栈、帧数据
局部变量以从零开始的单词数组形式组织。
这些iload_1、iload_2、iload_3是局部变量数组的入门级别。因此,iload_1表示引用局部变量数组的第一个索引。类似地,iload_2和iload_3分别表示引用局部变量数组的第二个和第三个索引。
因此,在这些iload_1、iload_2和iload_3中没有具体区别,而是引用局部变量数组中相应的索引。

我认为局部变量的前三个元素比其余变量更快地访问,因为它涉及索引。 iload_1 和 iload #index 的汇编/C实现将有助于更好地理解它。 - Ishwar Chandra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接