今天写个个代码必须得从Class.forName加载指定类名的类,忽然想到是否性能是否会有影响呢,特地做了下测试。
1、被实例化的类
public class Foo {
private static final int max_count = 1000;
private static int count = 0;
public void bar() throws Exception {
// do nothing
}
}
2、测试类
public class ClassforNameTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Foo f = null;
int count = 10000000;
long newBegin = System.currentTimeMillis();
for(int i=0; i<count; i++) {
f = new Foo();
}
System.out.println("speed time:" + (System.currentTimeMillis() - newBegin));
Class fc = null;
long forNameBegin = System.currentTimeMillis();
for(int i=0; i<count; i++) {
fc = Class.forName("Foo");
}
System.out.println("speed time:" + (System.currentTimeMillis() - forNameBegin));
long newInstanceBegin = System.currentTimeMillis();
for(int i=0; i<count; i++) {
f = (Foo)fc.newInstance();
}
System.out.println("speed time:" + (System.currentTimeMillis() - newInstanceBegin));
}
}
new speed time:15
forName speed time:923
newInstance speed time:140
结论:
如果性能要求特别高的话,最好将Class.forName的结果缓存起来后再通过newInstance创建实例,避免重复加载类。