Hibernate实现。 我们支付反思罚款吗?

很久以前,我正在使用reflection创建一个迷你ORM。

在阅读有关反思时,我得到了类似的答案:

Javareflection性能

这是完全有道理的,我退出我的迷你orm并锐化我的CTRL + C,CTRL + V键(lib旨在避免不得不一次又一次地重写我正在处理的Web应用程序中不同表的相同片段)

多年后由于某种原因,我现在不记得了(也不想记得)我正在阅读(或试图…)Hibernate源代码,因为我想知道他们是否使用AOP动态生成代码并避免反思惩罚,但令我惊讶的是,我所看到的只是纯粹的反思。

这是否意味着最受欢迎的ORM框架,确切地说是几年前我不鼓励我继续我的天真努力? :“)

我的问题是:有人可以确认我对Hibernate实现的理解吗? 他们是否动态生成字节码以提高性能? 或者我们(当我们使用它时)总是支付reflection惩罚(顺便说一句,如果差异是在某些ms,我们没有人注意到也没有抱怨)

我们支付反思罚款吗? 如果我们是,我认为这是值得的!

问候。

Hibernate使您的模型具有hibernate意识。

使用Reflection有不同程度的成本。 不断地查找特定类的方法特别昂贵。 使用缓存副本通过reflection执行方法并不是那么慢。 如果考虑到reflectionapi必须完成的任务来调用该方法,那么每个部分都很慢并且消耗cpu周期都是有意义的。

找到一个方法

  • 访问特定课程的每个方法
  • 测试每个方法的可见性,方法签名等
  • 找到的方法生成字节码。

典型类中的方法数量中的一个因素并且这些操作中的一些不是微不足道的,显然这可能是昂贵的。

调用方法。

每个reflection方法都相当于一些字节代码,它使用一些样板来调用目标方法以匹配reflection接口。 在它可以做到这一点之前,它必须执行一些健全性检查,以便它可以抱怨好消息,而不是让运行时抛出ClassCastException和类似的exception。

  • 如果实例方法检查传入的实例是非null并且是正确的类型。
  • 检查参数参数包括正确的参数数量和类型。
  • 在try catch中执行该方法。 在投掷ITE等

所有这些额外的东西增加了一些成本 – 不是很多,但它确实使事情变得更慢。

运行时成本

在一般的缓存方法和调用不成本,但有点慢。 reflectionapi本身会尝试缓存方法和类,但找到正确的方法等仍然是一个缓慢的操作。

我认为重要的是要记住整个应用程序的相对成本。 reflection比普通对象创建慢吗? 是。 reflection变得越来越快了吗? 是。 但是,在比较reflection成本与线路上的成本并对数据库做一些事情时,这些点并不是非常重要,这就是hibernate的作用 – 成本完全可以忽略不计,我说我们不付出代价。

持久性和检索的成本是reflection成本的很多倍。 要从DB访问记录可能需要1-10毫秒,并且构造具有reflection的对象可能需要0.001到0.01毫秒。

NHibernate不会缓存通过reflection收集的类信息,所以你只需要第一次支付罚款吗?

你真的通过使用NHibernate来支付reflection惩罚但是如果你通过NHibernate.Bytecode.IBytecodeProvider提供所有优化的reflection实现,它的可扩展性允许你避免90%的reflection惩罚。