MethodHandler 不会产生 boxing
static int add(int a, int b){
return a + b;
}
@Test
public void directAdd() throws Throwable {
// 编译 31ms
System.out.println(System.currentTimeMillis());
int r = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
r += add(i, j);
}
}
System.out.println(r);
System.out.println(System.currentTimeMillis());
}
@Test
public void directAddBoxing() throws Throwable {
// 使用 Integer,引入 boxing unboxing 开销,526ms
System.out.println(System.currentTimeMillis());
int r = 0;
for (Integer i = 0; i < 10000; i++) {
for (Integer j = 0; j < 10000; j++) {
r += add(i, j);
}
}
System.out.println(r);
System.out.println(System.currentTimeMillis());
}
@Test
public void invokeReflectionTest() throws Throwable {
// 反射 1s127ms
Method add = RuntimeOptimization.class.getDeclaredMethod("add", int.class, int.class);
System.out.println(System.currentTimeMillis());
int r = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
r += (int) add.invoke(null, i, j);
}
}
System.out.println(r);
System.out.println(System.currentTimeMillis());
}
@Test
public void invokeMethodHandlerTest() throws Throwable {
// MethodHandler 210ms
MethodHandle add = MethodHandles.lookup().findStatic(RuntimeOptimization.class, "add", MethodType.methodType(int.class, int.class, int.class));
System.out.println(System.currentTimeMillis());
int r = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
r += (int) add.invokeExact(i, j);
}
}
System.out.println(r);
System.out.println(System.currentTimeMillis());
}
可见 MethodHandler 比boxing/unboxing的编译版本还要快,显然它在编译时消除了boxing开销,也就是说 invokeExact(Object...) 并不会真的 boxing,Object invokeExtract 也不返回 Object 后再 unboxing 到 int。所以不必纠结为何不提供 add.pushInt(a).pushInt(b).invoke() 这样的结构,编译器已经做了这项优化。
当然,再怎么折腾还是比编译版本慢 10 倍,目前没有更好的办法了。
MethodHandler 不会产生 boxing的更多相关文章
- 【C#】 装箱 (boxing) 和拆箱 (unboxing)
目录: 1. 装箱和拆箱 2. 深入理解装箱和拆箱 3. int[] to object[],值类型数组到对象数组的转化 4. 使用泛型减少装箱和拆箱 1. 装箱和拆箱 装箱 就是把“值类型”转换成 ...
- Java中的boxing和unboxing(转)
测试代码: System.out.println(0L == 0);//true System.out.println(((Long)0L).equals(0));//false Integer i1 ...
- [Done]FindBugs: boxing/unboxing to parse a primitive
在开发过程中遇到了以下问题: FindBugs: boxing/unboxing to parse a primitive 查看代码(左边是老代码,右边是新的): 问题出在 自动装箱和拆箱的检查. 参 ...
- boxing & unboxing
[boxing & unboxing] Boxing is the process of converting a value type to the type object or to an ...
- 你真的了解装箱(Boxing)和拆箱(Unboxing)吗?
所谓装箱就是装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程.而拆箱就是反过来了.很多人可能都知道这一点,但是是否真的就很了解boxing和unboxing了呢?可以看下下 ...
- 自动装箱(boxing)和自动拆箱(unboxing)
摘自:http://www.codeceo.com/article/java-boxing-unboxing.html Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器 ...
- Real Boxing 2
http://itunes.apple.com/ca/app/real-boxing-2/id932779605?mt=8&ign-mpt=uo%3D4
- Boxing
测试自动装箱和自动拆箱,意思是运行的时候编译器帮我们加了两个代码: public class AutoBoxingandUnBoxing { public static void main(Strin ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- .Net中的AOP系列之《方法执行前后——边界切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...
随机推荐
- websocket打造在线聊天室
1. 常见的网络通信协议 tcp udp http 和 websocket 等 : http 超文本传输协议 ,是一个无状态,无连接,单向的应用层协议,缺点是服务器不能主动的给客户端发送消息 :消息 ...
- 妙用编辑器:把EverEdit变成计算器
妙用编辑器:把EverEdit变成计算器 应用场景 日常工作过程中,会存在需要计算一些数据的场景,调用系统的计算器当然可以完成这项工作,但是需要来回切换,且系统自带的计算器没有表达式计算功能,真是不方 ...
- 自学PHP笔记(二) PHP数据类型
本文转发来自:https://blog.csdn.net/KH_FC/article/details/115415323 PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 bool ...
- C#实现信创国产Linux麦克风摄像头推流(源码,银河麒麟、统信UOS)
随着国际政治经济形势的变化,尤其是中美科技竞争日益激烈,软件信创国产化已经迫在眉睫.在这种大环境下,我们将现有的Windows版软件逐步迁移到信创国产化基础设施上,适配国产操作系统(如银河麒麟.统信U ...
- Cartographer的扫描匹配
cartographer 代码思想解读(1)- 相关匹配 cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构.目前网上可以找到许多博主对其分析和理解.其car ...
- 国产东方通消息队列TongLINKQ8.1服务端安装步骤
一.服务端安装 groupadd tlq # 新建组 useradd -m -g tlq tlq # 新建tlq用户并指定组tlq cd /home/tlq/ # 切换到安装目录并上传安装包 tar ...
- 无套路领取《AI应用开发专栏》
最近有些时间没有更新技术文章了,都在忙着写<AI应用开发入门>专栏,专栏已整理放到了github上,有兴趣的小伙伴可以移步github阅读,地址见文末. 1.为什么写这个文档 之前陆续写了 ...
- 3.9 Linux查看目录中的文件(ls命令)
通过学习cd 和 pwd 命令,相信读者已经能够在庞大的 Linux 文件系统中,随心所欲地游荡并确定自己所在的位置了.本节继续来学习,如何知道某目录中存放了哪些文件或子目录. ls 命令,list ...
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现十
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...
- pycharm生成的allure测试报告如何查看本地的index.html文件?
pycharm生成的allure测试报告应该是通过服务启动查看,但是如果把这个文件保存到本地查看,直接打开页面无内容 可以使用allure-combine工具实现本地正常打开 `from allure ...