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的更多相关文章

  1. 【C#】 装箱 (boxing) 和拆箱 (unboxing)

    目录: 1. 装箱和拆箱 2. 深入理解装箱和拆箱 3. int[] to object[],值类型数组到对象数组的转化 4. 使用泛型减少装箱和拆箱 1.  装箱和拆箱 装箱 就是把“值类型”转换成 ...

  2. Java中的boxing和unboxing(转)

    测试代码: System.out.println(0L == 0);//true System.out.println(((Long)0L).equals(0));//false Integer i1 ...

  3. [Done]FindBugs: boxing/unboxing to parse a primitive

    在开发过程中遇到了以下问题: FindBugs: boxing/unboxing to parse a primitive 查看代码(左边是老代码,右边是新的): 问题出在 自动装箱和拆箱的检查. 参 ...

  4. boxing & unboxing

    [boxing & unboxing] Boxing is the process of converting a value type to the type object or to an ...

  5. 你真的了解装箱(Boxing)和拆箱(Unboxing)吗?

    所谓装箱就是装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程.而拆箱就是反过来了.很多人可能都知道这一点,但是是否真的就很了解boxing和unboxing了呢?可以看下下 ...

  6. 自动装箱(boxing)和自动拆箱(unboxing)

    摘自:http://www.codeceo.com/article/java-boxing-unboxing.html Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器 ...

  7. Real Boxing 2

    http://itunes.apple.com/ca/app/real-boxing-2/id932779605?mt=8&ign-mpt=uo%3D4

  8. Boxing

    测试自动装箱和自动拆箱,意思是运行的时候编译器帮我们加了两个代码: public class AutoBoxingandUnBoxing { public static void main(Strin ...

  9. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  10. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

随机推荐

  1. 【赵渝强】使用二进制包部署Kubernetes集群

    在一些企业的私有环境中可能无法连接外部的网络.如果要在这样的环境中部署Kubernetes集群,可以采集Kubernetes离线安装的方式进行部署.即:使用二进制安装包部署Kubernetes集群,采 ...

  2. thinkphp在原字段上面进行加减操作

    经常有需要对某个数据表的计数字段进行加减操作,我们来看下在ThinkPHP中的具体使用办法. 最简单的,使用下面方法对score自加,第二个参数也可以不要,默认加1:   M('User')-> ...

  3. USB总线-Linux内核USB3.0 Hub驱动分析(十四)

    1.概述 USB Hub提供了连接USB主机和USB设备的电气接口.USB Hub拥有一个上行口,至少一个下行口,上行口连接上一级的Hub的下行口或者USB主机,连接主机的为Root Hub,下行口连 ...

  4. MyBatis的常见面试题

    MyBatis 1.什么是MyBatis MyBatis是一款优秀的半自动化的持久层框架.支持自定义 SQL.存储过程以及高级映射. 2.MyBatis的特点? 简单.灵活.解耦.丰富的标签 3.My ...

  5. kotlin类与对象——>数据类、密封类、泛型

    数据类,用来保存数据的类,使用data对class进行标记 data class User(val name: String, val age: Int) //编译器自动从主构造函数中声明的所有属性导 ...

  6. AWS学习笔记-网络

    [用语]网络组件解释:https://zhuanlan.zhihu.com/p/137963921 VPC之间建立连接. VPC对等连接(VPC Peering) 私有子网中的实例访问Internet ...

  7. dotnet core微服务框架Jimu介绍

    jimu是一个基于.Net6.0 简单易用的微服务框架,参考了很多开源库以及想法,使用了大量的开源库(如 DotNetty, consul.net, Flurl.Http, Json.net, Log ...

  8. Excel两张表查重,返回True

    =VLOOKUP(P2,Sheet2!A:A,1,0)=P2 VLOOKUP(A1,Sheet2!A:D,1,0) VLOOKUP--首列查找 A1--查找条件 Sheet2--同一工作簿中的第二工作 ...

  9. C# 串口读取并转换字符串

    public string ReadString() { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] readBuffer = new byte ...

  10. 【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit

    1.问题描述: 使用系统分享组件分享本地文件,点击分享菜单下方的"另存为" 将要分享的文件分享至系统文件管理中,在文件管理中查看分享进来的文件为0B.尝试了3种uri的写法都不行, ...