java 内联调用深度_Java中内联虚拟方法调用的性能

java 内联调用深度

总览

动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联。

内联代码可提高性能时,代码仍必须检查类型(以防由于优化而更改了类型)或在多个可能的实现之间进行选择。

这导致了问题。 通过接口调用的方法的多个实现如何影响性能。

标杆管理

基准测试了作为列表元素调用的简单方法。 它比较列表中不同类的数量以查看其性能,但还改变了展开循环的数量,从而减少了可能的类数量。 例如,对于一个12种不同类的列表,以重复模式,在不展开的情况下,方法调用可能是12种类中的任何一种,但是当循环展开为2种程度时,每个调用只有6种可能的类(12 / 2)。 展开为三个级别时,每个调用有12个(4/3)个可能的类,对于展开为六个级别的循环,只有两个可能的类。 注意:每行代码可能的类都不相同。

这些是2.5 GHz i5上的结果。 时间以纳秒为单位。 轴标题是指从给定代码行使用或调用的不同类的数量。

1二手 2二手 3二手 4二手 6二手 8二手 12已使用
每个呼叫站点1个 48.4 46.6 46.9 43.7 48.7 54.9
每个呼叫站点2个 115.8 80.5 92.8 87 112
每个呼叫站点3个 285 283 271
每个呼叫站点4个 669 281 275
每个呼叫站点6个 562 275
每个呼叫站点8个 498
每个呼叫站点12个 530

看起来,加载的类的数量,甚至列表中的类的数量,都不如从给定代码段调用的可能的类的数量重要。 看起来同一循环中的不同代码段可以独立进行优化。

您会看到,如果给定调用只能创建一个可能的类,则程序中使用的类数无关紧要。

另一个含义是,如果要通过一个公共接口比较两个选择,则必须小心如何运行测试,这样就不会因为只使用一种类型的事实而偏爱第一次运行。 为了解决这个问题,我建议; 多次运行所有测试,总共至少2秒钟。 这样可以减少与您执行测试的顺序相关的bais。

参考:来自Vanilla Java博客的JCG合作伙伴 Peter Lawrey 在Java中内联虚拟方法调用的性能

翻译自: https://www.javacodegeeks.com/2012/12/performance-of-inlined-virtual-method-invocations-in-java.html

java 内联调用深度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值