2019年6月30日,星期日

☀️🏖🏄‍♀️ 以及模式缓存去重和 getutc 消失

由 kaspth 发布

大家好!🚢 登上我们的船,一起在这次的 Rails 新闻中巡游吧。对许多 Rails 贡献者来说,夏天已经真正进入了“热烈燃烧”的阶段:我们看到的贡献减少了。请注意!你们忠实的船长 Kasper 在这里向你们保证,船上一切正常,这仅仅是夏日时节的正常现象。但是,引擎着火了?哦,没关系,它很快就会烧完,另一个错误也得到了纠正!这很好。🔥

Schema Cache: 重复结构去重

本周是 Active Record 的 schema cache(模式缓存)强劲的一周,进行了不少于 3 项改进。这是一个鲜为人知的特性,但它避免了在每次新服务器启动时查询数据库的 schema(这在你启动多个应用服务器时非常有用)。你可以通过以下方式调用它……

Schema Cache: 停止序列化和解析 columns_hash

rails schema:cache:dump,查看它的文档了解更多信息。这 3 项更改是通过去重来减少正在运行的应用中 schema cache 所持有的内存。基本上,是对对象运行 uniq 操作,并重用已初始化的对象。这种技术虽然不常见,但在这里却很有效,因为许多表共享相同的列,例如 idcreated_atupdated_at 等。所以第一个更改……

Schema Cache: 使用 init_with 时去重

……对 schema cache 中的大多数内容进行了去重。第二个更改跳过了将 columns_hash 存储在 YML 中,因为它可以通过 columns.index_by(&:name) 推导出来。这样就避免了再次存储每个列对象,而是将其嵌套在名称下。很棒!作为这些功能的收尾:在解析 YML 并调用 init_with 的解析器时,也应该进行去重。已修复,呼!我建议你查看所有这三个更改,因为它们展示了如何在多个 PR 中真正地重塑一个特性。

Active Record: 序列化时避免冗余的 time.getutc

最后,总结一下新闻:还有一些提速!当前序列化一个 Time 属性会在多个地方运行 time.getutc,而不管时间是否已经是 UTC,这相当耗时。这个更改会检查时间是否已经是 UTC,从而避免任何不必要的转换。⏱

在过去的两个星期里,有 21 位贡献者为 Rails 做出贡献。你可以在 这里查看完整的更改列表

下次再见!