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