我正在阅读ArrayList 类的源代码,我想知道方法add(E e, Object[] elementData, int s)。
我已经阅读了它的描述,但我不明白其中的某些部分。
像这些:
将方法字节码大小保持在 35(-XX:MaxInlineSize 默认值)以下,这有助于在 C1 编译循环中调用 add(E) 时。
“方法字节码大小”是方法编译到的JVM 指令数。粗略地说,方法越短,这个数字就越低。
所述C1-编译器是在HotSpot虚拟机编译器中的一个。它的工作是将 Java 字节码编译为由 JVM 实际执行的本机代码。
“内联”意味着将被调用的方法的代码直接放入调用本机代码中,而不是实际执行“跳转”指令。这有助于以更大的代码大小为代价避免“跳转”指令的开销。
默认情况下,C1 编译器只内联足够小的方法(通过方法字节码大小来衡量)。
提取该方法使该方法的字节码大小保持add(E)在内联的默认阈值以下,从而使其更有可能add(E)被内联(这反过来又允许该方法也有可能被内联)。
总而言之,这是一个非常针对 JVM 的优化,在通用代码中使用通常是一个非常糟糕的主意。
这种优化在这里被认为可以接受的原因可能有两个:
ArrayList.add将在几乎所有在 Java 上运行的代码中执行很多| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |