-2

クラスにアクセサーを提供するのが良いか悪いかに関わらず、リフレクションを介してオブジェクトの特定の属性へのアクセスを実行すると、パフォーマンス(メモリ消費またはCPU時間)が低下するかどうかを知りたいです。

これを実装してベンチマークを実行しましたか?そのようなベンチマークを実行した人を知っていますか?

編集:

パフォーマンスの低下が明らかであることを示すいくつかのコメントのために、質問のタイトルを変更して、リフレクションを使用してアクセサーを実装することの影響がどれほど悪いかを知りたいことを示しました。

編集:

親切なコメントと回答ありがとうございます。@Peter Lawreyからの回答と、@ EJPからの親切なコメントに基づいて、これは私が意味し、私の質問の前に実装した人がいるかどうかを知りたいと思ったものです。

package co.com.prueba.reflection;

import java.lang.reflect.Field;

public class A {

private String s;


public void setS(String s){
    this.s=s;
}

public String getS(){
    return this.s;
}

public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {

    System.out.println("Invoking .setAccesible(true) ...");
    A secondA = new A();
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        Field f = secondA.getClass().getDeclaredField("s");
        f.setAccessible(true);
        f.get(secondA);
        long end = System.nanoTime();
        System.out.println((end - start));
    }

    System.out.println("Without invoking .setAccesible(true) ...");
    A firstA = new A();     
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        Field f = firstA.getClass().getDeclaredField("s");          
        f.get(firstA);
        long end = System.nanoTime();
        System.out.println((end - start));
    }

    System.out.println("Invoking the getter ...");
    A thirdA = new A();
    for(int i=0; i<10; i++){
        long start = System.nanoTime();
        thirdA.getS();
        long end = System.nanoTime();
        System.out.println((end - start));
    }


}

}

結果は次のとおりです。

ここに画像の説明を入力してください

皆さん、ありがとうございました。

4

4 に答える 4

3

一般的なマシンでは、リフレクションを介してゲッターを呼び出すコストは約 3 ns です。セッターもほぼ同じです。ゲッターはリフレクションなしでインライン化または削除できるため、相対的な違いが大きくなります。

3 ns でどれだけの違いが生じるでしょうか?

私はコード例を提供しており、昨日の回答はこちらです。;)

于 2013-01-04T16:46:08.270 に答える
2

他の人が話している最小限のパフォーマンス ヒットだけを得るには、これには既存のオブジェクトに対するリフレクション コールのみが含まれることを必ず理解してください。Methodすべての呼び出しでルックアップを行うと、パフォーマンスへの影響が大きくなります。

于 2013-01-04T16:56:55.570 に答える
0

このスレッドは、一般的なパフォーマンスに関する質問に答えていると思います。そして、このブログが少しでも情報を得るのに役立つことを願っています。ベンチマーク値について。IBM- Reflection パフォーマンス ベンチマークからの投稿など、いくつかの外部リンクがあります。ベンチマーク値について説明します。

于 2013-01-04T16:39:36.003 に答える
0

Java リフレクションのパフォーマンス

以前よりは改善されていますが (1.4 より前だと思います)、変数に直接アクセスするよりもまだ遅いです。クラスとすべての属性をメモリにロードしてから、必要なものをリストから検索する必要があるためだと思います。

変数に直接アクセスすることは、仮想メソッド呼び出しを切り取るために Android 開発を行うときに Google によって推奨されています (または少なくともそうでした)。

于 2013-01-04T16:40:39.053 に答える