ava的动态性支持学习七 - 方法句柄调用的性能对比
2013-01-10 16:10
459 查看
Java的动态性支持学习一 - 反射机制 概念概述
Java的动态性支持学习二 - 反射机制 属性、方法、对象的操作
Java的动态性支持学习三 - 反射机制 取消属性、方法、构造器的访问限制
Java的动态性支持学习四 - 反射调用的性能对比
Java的动态性支持学习五 - 方法句柄 概念和句柄类型
Java的动态性支持学习六 - 方法句柄 获取和调用
Java的动态性支持学习七 - 方法句柄调用的性能对比
使得Java语言对动态更好的支持,而且性能也有很大的提升。就让我们实际测试来看看结果对比吧.
测试代码如下
package net.oseye; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; public class ReflectTest { //直接调用 public static int numAdd(int loops){ int val=0; long startTime=0; for(int i=0;i<loops;i++){ if(i==0){startTime=System.nanoTime();} val+=i; } long totalTime=System.nanoTime()-startTime; System.out.println("直接调用总的纳秒时间:\t\t"+totalTime); return val; } //引用调用字段 public static int numAddReference(int loops){ User user=new User(); long startTime=0; for(int i=0;i<loops;i++){ if(i==0){startTime=System.nanoTime();} user.num+=i; } long totalTime=System.nanoTime()-startTime; System.out.println("引用调用字段总的纳秒时间:\t"+totalTime); return user.num; } //反射调用字段 public static int numAddReflection(int loops) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ User user=new User(); Class<?> cUser=user.getClass(); long startTime=0; for(int i=0;i<loops;i++){ if(i==0){startTime=System.nanoTime();} Field field=cUser.getField("num"); field.set(user, field.getInt(user)+i); } long totalTime=System.nanoTime()-startTime; System.out.println("反射调用字段总的纳秒时间:\t"+totalTime); return user.num; } //方法句柄 public static int numAddMethodHandle(int loops) throws Throwable{ User user=new User(); MethodHandles.Lookup lookkup=MethodHandles.lookup(); MethodHandle mthGet=lookkup.findGetter(User.class, "num", int.class); MethodHandle mthSet=lookkup.findSetter(User.class, "num", int.class); long startTime=0; for(int i=0;i<loops;i++){ if(i==0){startTime=System.nanoTime();} mthSet.invokeExact(user,(int)mthGet.invokeExact(user)+i); } long totalTime=System.nanoTime()-startTime; System.out.println("方法句柄调用字段总的纳秒时间:\t"+totalTime); return user.num; } public static void main(String[] args) throws Throwable{ int loops=1000000; numAdd(loops); numAddReference(loops); numAddReflection(loops); numAddMethodHandle(loops); } } class User{ public int num; }
输出结果:
直接调用总的纳秒时间: 1794701 引用调用字段总的纳秒时间: 2788712 反射调用字段总的纳秒时间: 2719845383 方法句柄调用字段总的纳秒时间: 51663111
测试100万次,除掉第一次的时间,可以看出反射耗时最多,其实是方法句柄。当然根据测试的次数不同,机器的配置不同,结果稍有不同。
相关文章推荐
- Java的动态性支持学习四 - 反射调用的性能对比
- Java的动态性支持学习六 - 方法句柄 获取和调用
- Java的动态性支持学习五 - 方法句柄 概念和句柄类型
- Java的动态性支持学习二 - 反射机制 属性、方法、对象的操作
- Java的动态性支持学习三 - 反射机制 取消属性、方法、构造器的访问限制
- Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法
- jdk7 新特性-Java语言的动态性-脚本语言支持api-方法调用05
- 通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)
- Python学习之模块间互相调用方法详解
- 通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)
- Java SE学习笔记:反射、反射创建实例,反射调用方法
- 【Java学习笔记】父类引用指向子类对象时方法的调用
- JAMon监控web工程方法的调用性能
- javascript调用COM组件,"错误: 对象不支持此属性或方法"
- [我的ASP.net学习历程]调用类库函库的简单加密方法
- Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)
- 从字符串中查找字符出现次数的方法和性能对比
- 开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)
- 从一个窗体类调用另一个窗体类中方法,出现句柄错误问题
- Map四种方法的读写性能对比