通过反射获取的方法的执行时间是否更长?

林姆尼克

众所周知,可以使用方法来获取方法Reflection并通过返回的Method实例调用该方法

我的问题是;一旦获取它,Reflection并且我Method一遍又一遍地调用,该方法的性能是否会比正常调用方法慢?

例如:

import java.lang.reflect.Method;

public class ReflectionTest {

    private static Method test;

    public ReflectionTest() throws Exception {
        test = this.getClass().getMethod("testMethod", null);
    }

    public void testMethod() {
        //execute code here
    }

    public static void main(String[] args) throws Exception {
        ReflectionTest rt = new ReflectionTest();
        for (int i = 0; i < 1000; i++) {
            rt.test.invoke(null, null);
        }

        for (int i = 0; i < 1000; i++) {
            rt.testMethod();
        }
    }
}

我之所以这么问是因为我正在创建一个事件系统,该事件系统在注册侦听器后会扫描注释。将这些方法放入映射中,然后在每次发生所需参数类型的事件时执行这些方法。我不知道这是否足以胜任例如游戏。

艾略特新鲜

使用无反射的方法大约要快一个数量级。我测试像

public static void main(String[] args) throws Exception {
    ReflectionTest rt = new ReflectionTest();
    // Warm up
    for (int i = 0; i < 100; i++) {
        test.invoke(rt, null);
    }
    for (int i = 0; i < 100; i++) {
        rt.testMethod();
    }

    long start = System.nanoTime();
    for (int i = 0; i < 10000; i++) {
        test.invoke(rt, null);
    }
    long end = Math.abs((start - System.nanoTime()) / 1000);
    start = System.nanoTime();
    for (int i = 0; i < 10000; i++) {
        rt.testMethod();
    }
    long end2 = Math.abs((start - System.nanoTime()) / 1000);
    System.out.printf("%d %d%n", end, end2);
}

我也搬到test了一个static领域,以便它可以编译并运行

private static Method test;
static {
    try {
        test = ReflectionTest.class.getMethod("testMethod");
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    }
}

我得到一个相当一致的差异(或输出一致)

4526 606

这表明跨10000调用反射比直接调用慢约7倍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

启用并行执行并通过maven命令完成执行时获取总执行时间

来自分类Dev

跟踪方法执行时间

来自分类Dev

setter方法的执行时间

来自分类Dev

执行时间

来自分类Dev

Postgresql函数的执行时间比同一查询更长

来自分类Dev

通过JUnit测试Java方法的执行时间和内存消耗

来自分类Dev

获取服务器上所有方法的执行时间

来自分类Dev

获取服务器上所有方法的执行时间

来自分类Dev

通过位的长度确定程序的执行时间?

来自分类Dev

通过使用普通PC确定µController的执行时间

来自分类Dev

静态转换是否需要执行时间?

来自分类Dev

是否可以估算Dask操作的执行时间

来自分类Dev

是否可以估算Dask操作的执行时间

来自分类Dev

mongoDB获取查询的执行时间(以微秒为单位)

来自分类Dev

如何获取Julia中函数的执行时间?

来自分类Dev

如何从JUnit的TestResult获取测试的运行执行时间?

来自分类Dev

使用C程序获取Python脚本的执行时间

来自分类Dev

如何在日志中获取查询执行时间

来自分类Dev

获取大量bash脚本的执行时间信息

来自分类Dev

获取 Angular 中 HTTP 请求的执行时间

来自分类Dev

功能执行时间

来自分类Dev

测量执行时间

来自分类Dev

功能执行时间

来自分类Dev

设置方法/线程的最大执行时间

来自分类Dev

模拟方法的执行时间和顺序

来自分类Dev

测量Keras层执行时间的正确方法

来自分类Dev

测量功能执行时间的最佳方法

来自分类Dev

C#方法的执行时间测试

来自分类Dev

减少mysql中此查询的执行时间的方法