ByteBuddy 在 Hibernate 中的性能
ByteBuddy Performance in Hibernate
我目前正在考虑用 bytebuddy 替换 javassist(主要是出于性能原因)。
作为第一步,我尝试在休眠 (5.2.10) 中使用 bytebuddy 代理工厂。
不幸的是,代理 class 生成现在比以前慢三倍。
这是预期的吗?我发现的基准测试 (https://zeroturnaround.com/rebellabs/testing-the-performance-of-4-java-runtime-code-generators-cglib-javassist-jdk-proxy-byte-buddy/) 似乎表明 bytebuddy 应该比 javassist 更快。
我是不是漏掉了什么?
从这篇文章开始,Byte Buddy 变得更加先进并添加了更多功能。添加此类功能的一个不幸的副作用当然是需要时间来处理它们。
与此早期版本相比,导致性能下降的功能是对通用类型信息的处理。 Byte Buddy 研究泛型类型,只是检查它们是否存在会花费一些额外的时间,即使 class 是非泛型的。此外,为了考虑使用所谓的桥接方法的泛型方法覆盖,Byte Buddy 解释了类型层次结构。另一方面,忽略通用方法的 cglib 可以进行更简单的分析,但在处理可见性桥时有时会出错。
最后,像cglib这样的Byte Buddy在创建class和创建最高效代码之间面临着权衡。这种权衡强烈倾向于在 Byte Buddy 接近基线的情况下创建高效代码,即它本身不会增加任何开销,而只会增加所添加代码的开销,这对于 cglib 而言并非如此。
我目前正在考虑用 bytebuddy 替换 javassist(主要是出于性能原因)。 作为第一步,我尝试在休眠 (5.2.10) 中使用 bytebuddy 代理工厂。 不幸的是,代理 class 生成现在比以前慢三倍。
这是预期的吗?我发现的基准测试 (https://zeroturnaround.com/rebellabs/testing-the-performance-of-4-java-runtime-code-generators-cglib-javassist-jdk-proxy-byte-buddy/) 似乎表明 bytebuddy 应该比 javassist 更快。
我是不是漏掉了什么?
从这篇文章开始,Byte Buddy 变得更加先进并添加了更多功能。添加此类功能的一个不幸的副作用当然是需要时间来处理它们。
与此早期版本相比,导致性能下降的功能是对通用类型信息的处理。 Byte Buddy 研究泛型类型,只是检查它们是否存在会花费一些额外的时间,即使 class 是非泛型的。此外,为了考虑使用所谓的桥接方法的泛型方法覆盖,Byte Buddy 解释了类型层次结构。另一方面,忽略通用方法的 cglib 可以进行更简单的分析,但在处理可见性桥时有时会出错。
最后,像cglib这样的Byte Buddy在创建class和创建最高效代码之间面临着权衡。这种权衡强烈倾向于在 Byte Buddy 接近基线的情况下创建高效代码,即它本身不会增加任何开销,而只会增加所添加代码的开销,这对于 cglib 而言并非如此。