反射慢吗?慢多少?什么原因慢? 如何解决?

反射时间维度的对比

都说反射慢,是基于类方法的直接调用进行对比的。

以下是一个博主的测试(人家的劳动成果还是要尊重的)。

下面这个就是一个博主的测试记录。【https://baijiahao.baidu.com/s?id=1699699191243005417&wfr=spider&for=pc】 之对于测试部分参考一下。

img

img

img

为什么慢?

根本原因是编译器没法对反射相关的代码做优化。

我们都知道 Java 代码是需要编译才能在虚拟机里运行的,但其实 Java 的编译期是一段不确定的操作过程。因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程;也可能是程序运行期的即时编译器(JIT 编译器,Just In Time Compiler)把字节码文件编译成机器码的过程;还可能是静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成本地机器码的过程。

其中即时编译器(JIT)在运行期的优化过程对于程序运行来说更重要,Java虚拟机在编译阶段的代码优化就在这里进行,由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能要比非反射操作慢,因此应该避免在对性能敏感的应用程序中频繁使用Java反射来创建对象。

如何解决?

1.在需求设计上解决,能否用增加工作量换运行时间。

2.使用快速编译框架。

ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。说白了asm是直接通过字节码来修改class文件。ASM 第一次生成字节码比仅使用反射慢,但是一旦生成了字节码,它便与普通Java代码一样快,并且将由JIT编译器进行优化。

ASM [https://www.bilibili.com/read/cv9803401/]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程小明的coding

你的打赏是我研究最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值