【发布时间】:2022-02-05 21:46:31
【问题描述】:
我们知道有一些技术可以让虚拟调用在 JVM 中变得不那么昂贵,例如 Inline Cache 或 Polymorphic Inline Cache。
让我们考虑以下情况:
Base 是一个接口。
public void f(Base[] b) {
for(int i = 0; i < b.length; i++) {
b[i].m();
}
}
我从我的分析器中看到调用虚拟(接口)方法m 相对昂贵。
f 在热路径上,它被编译为机器代码 (C2),但我看到对 m 的调用是一个真正的虚拟调用。这意味着它没有被JVM优化。
问题是,如何处理这种情况?显然,我不能在这里使 m 方法不是虚拟的,因为它需要进行认真的重新设计。
我可以做任何事还是必须接受?我在考虑如何“强制”或“说服”JVM
- 在这里使用多态内联缓存 - b` 中不同类型的数量非常少 - 在 4-5 种类型之间。
- 展开此循环 -
b的长度也相对较小。展开后,内联缓存可能会在这里有所帮助。
提前感谢您的任何建议。 问候,
【问题讨论】:
标签: optimization jvm