Hibernate Validator 6.0 自去年8月首次发布以来已经成熟了许多。

我们增加了一些新功能,同时也投入了大量工作来提高整体性能。

我于去年10月发布了一篇博客文章,分享了我们基于 6.0.4.Final 的性能工作更新。

我们刚刚发布了 6.0.8.Final,并为下一个版本准备了更多的改进,因此确实是时候更新了。

参赛者

我们的想法是比较各种 Bean Validation 实现,并展示 Hibernate Validator 6.0 取得的进展。

我们决定基准测试 4 个实现

  • Hibernate Validator 6.0.9-SNAPSHOT(截至今天的 master 版本)

  • Hibernate Validator 6.0.4.Final(2017年10月25日发布)

  • Hibernate Validator 5.4.2.Final(2017年10月19日发布)

  • Apache BVal 1.1.2(2016年11月3日发布)

Hibernate Validator 5.4 和 Apache BVal 1.1 是 Bean Validation 1.1 的实现,因此在这个基准测试中,我们不会测试 Bean Validation 2.0 的新特性,而只测试两个版本规范中共同的功能。

Apache BVal 团队目前正在开发一个针对 Bean Validation 2.0 的新版本,所以我们可能会在他们完成之后发布新的更新。

基准测试

单元基准测试

在 Hibernate Validator 中,我们维护了一组JMH 基准测试,我们可以针对各种 Bean Validation 实现的版本运行这些测试。

这些基准测试非常简单:它们不执行复杂的验证,因为整个目的就是衡量验证引擎的开销。

对于这个基准系列,我们只运行SimpleValidation基准测试:我们只测试具有几个约束的简单Bean的验证。没有什么花哨的,只是普通的Bean验证。

Bean验证基准测试

这个基准测试是Apache BVal团队构建的现有基准测试的演变。

我们已经将其导入GitHub,并使其更加稳定(您可以生成随机Bean一次,并在多个基准测试中使用相同的Bean集)以及更灵活(更容易使用不同的Hibernate Validator实现)。我们还把项目迁移到JMH。

这是一个相当高级的基准测试,因为它生成了一组带有可调整场景的类,然后在这些生成的Bean上运行验证。

它支持诸如分组、继承等功能。

我们使用的默认场景生成了200个不同的Bean。

这是Bean验证可能真实用例的一个相当合理的近似。

请注意,这些数字与之前博客文章中的数字不可比,因为转换为JMH完全改变了基准测试的运行方式。

一些数字(和漂亮的图表!)

好的,您来这里是想看到更新的数字和图表,到目前为止,您只是看到了基准测试的介绍。不要离开,这里它们是!

SimpleValidation JMH基准测试

数字以ops/ms为单位,越高越好。

Bean验证基准测试

数字以ops/s为单位,越高越好。

结论

Hibernate Validator的速度比以往任何时候都要快:6.0.9-SNAPSHOT比6.0.4.Final快得多(约40-50%),而6.0.4.Final已经比5.4.2.Final和Apache BVal快2到3倍。

最后,我们强烈建议您密切关注并更新您的Hibernate Validator依赖项,尤其是如果您大量使用它(例如验证大量Bean)。

6.0.9.Final可能在一个月左右内发布。

经验教训

之前的博客文章中,我们分享了一些我们做出的更改和从这次迭代中学到的经验。

对于这次第二次迭代,我们继续走这条路,进行小的更改,优化常见情况,等等。

没有太大的变化,但我们从这项工作中学到的经验是,每一次小的更改都可能带来差异。

重现这些结果

这些基准测试是在典型的工程师笔记本电脑上运行的(Core i7,16GB内存)。

如前所述,本文中介绍的基准测试都是公开的,开源的,所以您可以自由运行它们。

考虑到Bean验证基准测试的随机性,您可能会得到略微不同的结果,但我相信它们将突出相似的改进。


返回顶部