总览

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

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

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

标杆管理

此基准测试了作为列表元素调用的简单方法。 它比较列表中不同类的数量以查看其性能,但还改变了展开循环的数量,从而减少了可能的类数量。 例如,对于一个12个不同类的列表,以重复的方式,在不展开的情况下,方法调用可能是12个类中的任何一个,但是当循环展开到两个程度时,每个调用只有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内联虚拟方法调用的性能相关推荐

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

    java 内联调用深度 总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联. 内联代码可提高性能时,代码仍必须检查类型(以防由于优化而更改了类型)或在多个可能的实现之间进行选择. 这导 ...

  2. java 内联_Java内联类初探

    java 内联 重要要点 Valhalla项目正在开发内联类,以提高Java程序对现代硬件的亲和力 内联类使开发人员能够编写行为更像Java内置基元类型的类型 内联类的实例不具有对象标识,这带来了许多 ...

  3. java内联_JAVA中的内联函数

    在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...

  4. jvm 方法内联_方法内联在JVM中有多积极?

    jvm 方法内联 在IntelliJ IDEA中使用Ctrl + Alt + M 提取方法 . Ctrl + Alt + M. 这就像选择一段代码并按此组合一样简单. Eclipse也有它 . 我讨厌 ...

  5. java内联函数_Java之内联函数_内联函数的优缺点

    描述 内联函数 1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 2.Java语言中有一个关键字fina ...

  6. java内联函数,JVM中的步骤内联

    JVM中的方法内联 在C++中,可以明确定义内联函数,使用inline关键字.在Java中不能定义内联函数,但是方法的内联在JIT编译中还是存在的,只不过是JIT自动优化的,我们无法在写代码的时候指定 ...

  7. Java知识整理——远程方法调用

    什么是RMI ? Java远程方法调用(RMI)是一个Java API,它执行的面向对象的等价远程过程调用(RPC)的方法,包括了直接传输序列化的Java类和分布式垃圾收集的支持. 远程方法调用(RM ...

  8. 使用JavaSymbolSolver解决Java代码中的方法调用

    为什么创建java-symbol-solver? 几年前,我开始使用JavaParser ,然后开始做出贡献. 不久之后,我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树 ...

  9. java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))

    先看代码如下: 运行结果 在上述代码中,类B继承了类A,类C继承了类B,A中show()方法发生了重载,B中重写了A中的show(C )方法. 这里先说一下向上造型的一个知识点:向上造型时,编译期时根 ...

最新文章

  1. LeetCode简单题之字符串转化后的各位数字之和
  2. 点、线、面生成mvt(MapBox Vector Tile)格式的瓦片总结
  3. 巧用Stream优化老代码,太清爽了!
  4. java的静态变量怎么赋值_java static变量可以赋值吗?
  5. 最简易上手的numpy学习笔记三
  6. idea设置关键字颜色_IDEA字体颜色快速导入辅助工具设置
  7. dm8148 videoM3 link源代码解析
  8. fckeditor 中文乱码问题
  9. struts2中的session使用
  10. Linux双网关配置(电信网通)
  11. Mac上编译Android8.0+
  12. Oracle的云计算模式
  13. python将多个txt内容合并_python合并多个txt文件成为一个文件
  14. 解决 pq: SSL is not enabled on the server
  15. 苹果手机设置邮箱服务器端口设置,苹果手机邮箱怎样设置
  16. php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
  17. android 视频背景图片,安卓手机怎么给视频添加背景图片 上下图片中间视频画面的小视频制作...
  18. mysql导入数据报错_MySQL导入数据库时报错,MySQL server has go away
  19. java通过poi操作ppt
  20. java生成word报告echart_Java这几个用 Pyecharts 做出来的交互图表,领导说叼爆了!...

热门文章

  1. maven项目 报错 java.lang.ClassNotFoundException: org.springframework.web.filter.HiddenHttpMethodFilter
  2. spring(6) 渲染web视图
  3. tomcat(7)日志记录器
  4. stripe pay_J2Pay –实施网关
  5. 过滤器过滤特定的url_如何从过滤器中排除URL
  6. lambda 序列化_如何以及为什么要序列化Lambda
  7. java oauth2.0_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录
  8. 游戏 服务器 微服务_整体服务器与微服务
  9. 使用Maven进行增量构建
  10. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试