设置和获取使用反射的性能

MBZ*_*MBZ 10 java reflection

是否设置和使用反射(得到一个对象的属性java.lang.reflect.Field getset功能),而不是调用setget对象本身,导致任何显著的性能差异?

Aub*_*bin 6

是的,基准测试很容易在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.

  • 我知道了.它是Java 7的一项功能.尼斯.http://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html (2认同)