是否设置和使用反射(得到一个对象的属性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 );
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
20
37381
1677
Run Code Online (Sandbox Code Playgroud)
比率接近1870 w/o可访问标志设置.设置它使比率下降到83.
归档时间: |
|
查看次数: |
4171 次 |
最近记录: |