当前位置: 首页 > 知识库问答 >
问题:

测试Java反射、方法句柄和镜像性能

李甫
2023-03-14

所以我的问题是:我的测试是对的?在我的应用程序中缓存方法查找有一些问题?或者我需要在需要使用invokeexact时总是进行查找?如果我不创建缓存,性能就太低了。

谢谢你

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class Reflecting {
    // testing method handle
    private MethodHandle mhConcat;
    private MethodHandle mhHashCode;

    // testing reflection     
    private Method rconcat;
    private Method rhashcode;

    // testing mirror api
    private MethodHandler mrConcat;
    private MethodHandler mrHashcode;

    @Setup
    public void setup() throws Exception {
        mhConcat = publicLookup().findVirtual(String.class, "concat", methodType(String.class, String.class));
        mhHashCode = publicLookup().findVirtual(Object.class, "hashCode", methodType(int.class));

        rconcat = String.class.getDeclaredMethod("concat", String.class);
        rhashcode = String.class.getDeclaredMethod("hashCode");

        mrConcat = new Mirror().on((Object) "x").invoke().method("concat");
        mrHashcode = new Mirror().on((Object) "xy").invoke().method("hashCode");
    }

    @GenerateMicroBenchmark
    public void invoke(BlackHole bh) throws Throwable {
        bh.consume((String) mhConcat.invokeExact("x", "y"));
        bh.consume((int) mhHashCode.invokeExact((Object) "xy"));
    }

    @GenerateMicroBenchmark
    public void reflect(BlackHole bh) throws Throwable {
        bh.consume(rconcat.invoke("x", "y"));
        bh.consume(rhashcode.invoke("xy"));
    }

    @GenerateMicroBenchmark
    public void mirror(BlackHole bh) throws Throwable {
        bh.consume(mrConcat.withArgs("y"));
        bh.consume(mrHashcode.withoutArgs());
    }
}

共有1个答案

储臻
2023-03-14

嗯,对“错误”的定义通常是从对什么是“正确”的定义开始的。假设您希望通过不同的方法来度量目标方法的调用成本,我可以列举一些可能需要注意的事情:

>

  • @GenerateMicroBenchmark建议您使用相当过时的JMH(几个月前它被重命名为@Benchmark)。考虑更新以获得更可靠的线束版本。

    使用blackhole-s是值得尊敬的,但是为什么每个@benchmark有两个方法调用?难道您不想单独量化每个特定调用的性能吗?否则,您可能会用另一种方法中的性能下降来掩盖一种方法中的性能改进。拆分这些方法还有助于使用隐式blackhole-S(即从@benchmark返回结果,而不是使用显式blackhole)。

    >

  • 建立可信的模型计算机是如何工作的,以及您的代码是如何与计算机交互的--这通常需要修改基准参数,看看它是否按照当前模型预测的方式响应(请参阅自然科学如何处理这方面的自然)。

    看看电脑操作的内部,看看它在忙些什么。使用侧写器,卢克!现在,对于您在测试中使用的纳米级基准测试,并不是所有的分析器都是好的。您可能必须开始处理生成的程序集和/或硬件计数器。到处找一个。JMH附带了一个非常基本的-prof perfasm

    换句话说,探索!

  •  类似资料:
    • 问题内容: 使用反射而不是调用类构造函数来创建对象是否会导致任何显着的性能差异? 问题答案: 由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能要比非反射操作慢,因此应避免在对性能敏感的应用程序中经常调用的代码段中。 这是一个简单的测试,我在运行Sun JRE 6u10的计算机上用5分钟的时间破解了它: 结果如下: 请记住,查找和实例化是一起完成的,在某些情况下,

    • 我试图将现有类中的静态方法添加到。所有方法都位于同一类中,代码如下: 当我运行代码时,我得到了。有什么想法吗?

    • 我正在使用JavaDSL来配置路由。我有一个类似于下面给出的路由。 在做了一些活动后,我该如何处理异常?在异常时,我尝试配置处理器和bean来重新引发异常。不管怎样,camel都在将异常设置为exchange,但没有破坏异常。 我在junit测试用例中这样做。我正在使用OneException处理器处理异常。在处理器内部,我正在进行断言。断言错误由camel自动处理,测试不会被标记为通过/失败。

    • 本文向大家介绍java反射耗时测试案例解析,包括了java反射耗时测试案例解析的使用技巧和注意事项,需要的朋友参考一下 java反射相对与普通的对象调用原理上来说更加耗时,在调用次数较少的情况下可忽略性能损失,但当调用次数非常多时,需要考虑到此问题,即调用次数过多时不宜使用反射,以下举例: 运行结果: 这是在简单使用反射调用某个方法的场景下1000000调用的性能差距。 以上就是本文的全部内容,希

    • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

    • 本文向大家介绍Java通过PropertyDescriptor反射调用set和get方法,包括了Java通过PropertyDescriptor反射调用set和get方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: 第二段: 第三段: 以上就是本文的全部内容,希望对大家的学习有所帮助