10

オブジェクト自体のandを呼び出すのではなく、リフレクション (java.lang.reflect.Field getおよび関数)を使用してオブジェクト属性を設定および取得すると、パフォーマンスに大きな違いが生じますか?setsetget

4

3 に答える 3

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 );
   }
}

結果:

20
37381
1677

レシオは 1870 に近く、アクセシブル フラグが設定されていません。設定すると比率が 83 に低下します。

于 2012-10-21T08:08:09.500 に答える
0

はい、それはパフォーマンスに大きな違いをもたらします。これをサポートする Web 上のベンチマーク結果はたくさんあります。

例: http://www.cowtowncoder.com/blog/archives/2007/02/entry_32.htmlget - orsetメソッドへの反射呼び出しは、フィールドに直接アクセス/更新するよりも最大 50 倍遅いと言っているようです。 . (そして、メソッドを使用した取得/設定Fieldはさらに遅くなります。)

現在、これらの結果はかなり古いものであり、(明らかに) 最近の HotSpot JVM ではリフレクションのパフォーマンスが改善されています。それでも、大まかな経験則は「1桁以上遅い」です。

于 2012-10-21T08:28:25.623 に答える