是否使用反射(java.lang.reflect.Field
get
和 set
函数)设置和获取对象属性,而不是调用set
和 get
对象本身,会导致任何显着的性能差异吗?
最佳答案
是的,基准测试很容易在 15 分钟内完成。
生成的代码更好,即使你缓存了反射访问器,我也试过了。
这里是在 Java 7 64 位下:
import java.lang.reflect.Field;
class Data {
public double _value;
public double getValue() { return _value; }
public void setValue( double value ) { _value = value; }
}
public class Reflect {
public static final int LOOP_COUNT = 100_000_000;
public static void main( String[] args ) throws Throwable {
Data d = new Data();
long start = System.currentTimeMillis();
for( int i = 0; i < LOOP_COUNT; ++i ) {
d.setValue( i );
}
System.err.println( System.currentTimeMillis() - start );
Field field = Data.class.getDeclaredField( "_value" );
start = System.currentTimeMillis();
for( int i = 0; i < LOOP_COUNT; ++i ) {
field.set( d, new Double( i ));
}
System.err.println( System.currentTimeMillis() - start );
field.setAccessible( true ); // Optimization
start = System.currentTimeMillis();
for( int i = 0; i < LOOP_COUNT; ++i ) {
field.set( d, new Double( i ));
}
System.err.println( System.currentTimeMillis() - start );
}
}
结果:
20
37381
1677
比率接近 1870,但未设置可访问标志。设置它会使比率下降到 83。
关于java - 使用反射设置和获取的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996053/