Ner*_*vic 13 performance jvm scala
楼梯书的摘录:
如果效率非常重要,那就倾向于使用一门课程.大多数Java运行时使类成员的虚方法调用比接口方法调用更快.Traits被编译到接口,因此可能会产生轻微的性能开销.但是,只有当您知道所讨论的特征构成性能瓶颈并且有证据表明使用类实际上解决了问题时,才应该做出此选择.
我写了一些简单的代码来看看幕后真的发生了什么.我确实注意到invokevirtual在抽象类和invokeinterface接口的情况下使用.但无论我写的是什么样的代码,他们总是粗略地执行相同的操作.我在服务器模式下使用HotSpot 1.6.0_18.
是JIT在优化方面做得如此出色吗?有没有人有一个示例代码证明书中有关invokevirutal更快操作的声明?
如果HotSpot注意到调用站点上的所有实例属于同一类型,则它可以使用单态方法调用,并且虚拟和接口方法都以相同的方式进行优化.PerformanceTechniques和VirtualCalls文档不区分虚拟和接口方法.
但在一般的非单形情况下,可能会有一些差异.该InterfaceCalls文件说:
没有简单的前缀方案,其中接口的方法在实现该接口的每个类中的固定偏移处显示.相反,在通用(非单态)情况下,汇编编码的存根例程必须从接收器的klassOop获取已实现接口的列表,并遍历该列表以寻找当前目标接口.
它还证实了单形情形对于两者都是相同的:
几乎相同的优化适用于接口调用以及虚拟调用.与虚拟调用一样,大多数接口调用都是单态的,因此可以通过廉价检查呈现为直接调用.
其他JVM可能有不同的优化.
您可以尝试一个微基准测试(如果您知道如何),它调用实现相同接口的多个类上的方法,以及扩展相同抽象类的多个类.这样就可以强制JVM使用非单态方法调用.(虽然在现实生活中任何差异都可能无关紧要,因为大多数呼叫站点都是单形的.)