-2

无论在类中提供访问器是好的还是坏的OO实践,我都想知道通过反射执行对对象特定属性的访问是否会降低性能(内存消耗或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

在典型的机器上,通过反射调用 getter 的成本约为 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 回答