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完全改变了基准测试的运行方式。
结论
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可能在一个月左右内发布。
经验教训
在之前的博客文章中,我们分享了一些我们做出的更改和从这次迭代中学到的经验。
对于这次第二次迭代,我们继续走这条路,进行小的更改,优化常见情况,等等。
没有太大的变化,但我们从这项工作中学到的经验是,每一次小的更改都可能带来差异。