您的位置:首页 > 其它

ava的动态性支持学习七 - 方法句柄调用的性能对比

2013-01-10 16:10 459 查看


使得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万次,除掉第一次的时间,可以看出反射耗时最多,其实是方法句柄。当然根据测试的次数不同,机器的配置不同,结果稍有不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: