星期三, 十月 26, 2005

Java Reflection (Java反射)性能说明

Java Reflection in ActionReflection Cost比较昂贵的说法一直很流行。
其实,如果没有太多的getMethod方法的调用。
直接运行方法的cost和通过invoke()Cost基本是一样的。
但在某些情况下,反射书写的代码更加紧凑和幽雅。
比如在实现SQL Type -->Java Type之间的Mapping的时候.
需要更新ResultSetupdateXXX 方法组的时候。
BTW:性能测试代码:
public class TestReflection
{

public static void main(String[] args) throws Exception
{
Object object = new Object();
Class c = Object.class;

int loops = 100000;

long start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
object.toString();
}
System.out.println( loops + " 正常方法调用:" + (System.currentTimeMillis() - start) + " milliseconds." );
java.lang.reflect.Method method = c.getMethod( "toString", null );

start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
method.invoke( object, null );
}

System.out.println( loops + " 通过反射调用方法但没有查找方法过程:" + (System.currentTimeMillis() - start) + " milliseconds." );
start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
method = c.getMethod( "toString", null );
method.invoke( object, null );
}
System.out.println( loops + " 通过反射调用方法包含查找方法过程:" + (System.currentTimeMillis() - start) + " milliseconds." );
}
}
测试结果:
C:\temp>java TestReflection
100000 正常方法调用:109 milliseconds.
100000 通过反射调用方法但没有查找方法过程:125 milliseconds.
100000 通过反射调用方法包含查找方法过程:312 milliseconds.

C:\temp>java -version
java version "1.4.2_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_09-b05)
Java HotSpot(TM) Client VM (build 1.4.2_09-b05, mixed mode)

C:\temp>d:\java\jdk1.5.0_05\bin\java TestReflection
100000 正常方法调用:94 milliseconds.
100000 通过反射调用方法但没有查找方法过程:110 milliseconds.
100000 通过反射调用方法包含查找方法过程:328 milliseconds.    

机器配置: 2.6G CPU.512M Memeory. WindowXp sp2

可见在调用次数非常少的情况下,花费的多余时间是可以忽略不计的。
在调用次数非常多的时候,必须注意要减少getMethod 寻找方法的
调用.