ovrflo / jit-hydrator
Doctrine ORM 默认对象加湿器的一个直接替换品,能够为每个查询生成优化的加湿代码。
Requires
- doctrine/orm: ^2.4
This package is auto-updated.
Last update: 2024-09-14 23:51:54 UTC
README
几乎可以直接替换 Doctrine ORM 的 ObjectHydrator,根据查询生成自定义的加湿代码。
工作原理
在它注册为 EntityManager 中的加湿器后,ORM 将调用它来加湿查询。此时,它会加载缓存的查询类,或者生成一个新的类。然后,生成的类将加湿结果集。
速度有多快?
在我的相当有限的测试中,它比 Doctrine ORM 的 ObjectHydrator 快 50-80%。虽然对于非常简单的查询(选择小于 10 列,没有 JOIN,只有 1-2 行)可能比 ObjectHydrator 稍差,但对于更大的查询,性能将显著提高。
下表显示了查询返回 1,10,100..1000000 行时加湿器的比较。时间以毫秒为单位。
安装
1. 使用 composer 安装包
composer require ovrflo/jit-hydrator
2. a. 如果使用 Symfony >=4.0
# config/packages/doctrine.yaml, under doctrine.orm key, add #doctrine: # orm: hydrators: jit: Ovrflo\JitHydrator\JitObjectHydrator
2. b. 如果在没有框架的情况下使用 Doctrine ORM
$entityManager->getConfiguration()->addCustomHydrationMode('jit', \Ovrflo\JitHydrator\JitObjectHydrator::class);
3. 为特定查询使用它
$query = $queryBuilder ->getQuery() ->setHint(Query::HINT_INCLUDE_META_COLUMNS, true) ->getResult('jit') ;
步骤 3 解释
注册后,为了使用它,你需要两样东西。最重要的是 getResult('jit')
,它告诉 Doctrine 使用该加湿器。第二件事是 ->setHint(Query::HINT_INCLUDE_META_COLUMNS, true)
。这是必需的,因为否则 Doctrine 不会将关系元数据传递给加湿器,并且它将无法工作。目前,只有 Doctrine 自己的 ObjectHydrator 没有这个查询提示就能接收这些信息。
状态
虽然这目前在一个相对较小的应用中运行,但我不敢称其为生产就绪。我相信其中还有一些错误需要修复。在我的有限测试中,它工作得很好,显著降低了响应时间和 CPU 使用率。更少的 CPU 时间意味着更快乐的用户,同时也意味着更低的开销。当然,我们通常不会考虑电费,但如果你的基础设施大量使用 Doctrine ORM,这实际上可能有所区别。如果你不担心电力消耗,那么至少考虑为你的代码库留出更多的 CPU 空间。我个人鼓励任何需要更快加湿器的人测试它,甚至可能发送一些问题和/或 PR 😊
致谢
我想感谢 @ocramius,他在 Doctrine ORM Hydration 的博客文章中给出了有见地的见解,这给了我实现这个想法的灵感。在博客文章的结尾,他建议通过生成加湿器代码可以提高性能。