很久以前,我正在使用反射创建一个迷你 ORM。
在阅读有关反射的内容时,我得到了类似的答案:
Java 反射性能
这是完全有道理的,我退出了我的迷你 orm 并锐化了我的 CTRL+C、CTRL+V 键(该库的目的是避免在我正在开发的网络应用程序中为不同的表一次又一次地重写相同的片段)
几年后,由于某种原因,我现在不记得(也不想记住)我正在阅读(或试图...)Hibernate 源代码,因为我想知道他们是否使用 AOP 动态生成代码并避免反射惩罚,但令我惊讶的是,我看到的所有东西都是纯粹的反射。
这是否意味着最受接受的 ORM 框架在几年前就阻止了我继续我天真的努力? :")
我的问题是:有人可以确认我对 Hibernate 实现的理解吗?他们是否会动态生成字节码以提高性能?或者我们(当我们使用它时)总是付出反射惩罚(顺便说一句,如果差异在某些毫秒内,我们没有人注意到或抱怨)
我们是否付出了反思代价?如果我们是的话,我认为是值得!!!
Regards.
Hibernate 使您的模型具有休眠意识。
使用反射有不同程度的成本。不断地查找特定类的方法是特别昂贵的。使用缓存副本通过反射执行方法并没有慢多少。如果考虑一下反射 api 必须完成才能调用该方法的任务,那么每个部分都很慢并且消耗 CPU 周期,这一切都是有道理的。
定位方法
- 访问特定类的每个方法
- 测试每个方法的可见性、方法签名等。
- 生成字节码found method.
其中一个因素是典型类中方法的数量,并且其中一些操作并不是微不足道的,很明显这可能是昂贵的。
调用该方法。
每个反射方法相当于一些字节代码,它使用一些样板来调用目标方法以匹配反射接口。在执行此操作之前,它必须执行一些健全性检查,以便它可以抱怨好的消息,而不是让运行时抛出 ClassCastException 和类似的异常。
- 如果实例方法检查传入的实例不为 null 并且类型正确。
- 检查参数参数是否包含正确数量和类型的参数。
- 在 try catch 中执行该方法。在 catch 中抛出 ITE 等。
所有这些额外的费用都会增加一些成本——虽然不是很多,但确实会让事情变得更慢。
运行时成本
一般来说,缓存方法和调用不会产生成本,但速度会慢一些。反射 api 本身确实尝试缓存方法和类,但找到正确的方法等仍然是一个缓慢的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)