Ruby JSON gem 的 API 改进与弃用说明

2025-08-09

本文介绍了 Ruby JSON gem 的维护者对 gem API 进行改进和弃用的原因和细节。主要涉及三个方面:首先,弃用了不安全的 `create_additions: true` 选项,并建议使用 `JSON.unsafe_load` 或显式传递选项;其次,弃用了对重复键的默认容忍行为,建议使用 `allow_duplicate_key: true` 选项;最后,虽然不打算弃用 `Object#to_json` 方法,但介绍了新的 `JSON::Coder` API,提供更安全灵活的 JSON 序列化方式,解决了全局行为和配置的问题。作者强调,弃用 API 的决策需要权衡利弊,并表示新的 API 提升了安全性并降低了出错风险。

阅读更多
开发

Ruby Ractor性能提升:锁释放与并发难题

2025-05-28

本文探讨了Ruby Ractor在处理类实例变量时的性能瓶颈。由于全局锁的存在,多Ractor并发访问类实例变量导致性能下降。文章深入分析了类实例变量的底层实现,并提出了一种通过对象委托来消除锁竞争的方案,有效提升了Ractor的性能,将微基准测试结果提升了近三倍。该方案还意外解决了命名空间特性中引入的bug和性能回归问题。

阅读更多
开发

Ruby Ractor性能提升:攻克`object_id`瓶颈

2025-04-27

Ruby 的 Ractor 并行模型因全局锁而性能受限。文章作者深入探讨了 `object_id` 方法的性能瓶颈,该方法因历史原因及垃圾回收机制的改进而导致锁竞争。作者通过优化 `object_id` 的实现,将其从全局哈希表查找改为在对象内直接存储,显著提升了 Ractor 的性能,尤其是在 JSON 性能测试中,Ractor 版本速度提升了两倍。虽然仍存在一些挑战,如对特殊对象类型的处理,但这项工作为 Ractor 的并行化进程迈出了关键一步。

阅读更多
开发

数据库协议的改进:重拾开发体验

2025-04-05

本文探讨了SQL数据库客户端协议的不足,特别是MySQL和PostgreSQL。作者指出,这些协议在连接管理、错误恢复和预处理语句方面存在问题,导致开发复杂度增加。例如,可变连接状态使得错误恢复困难,而预处理语句的会话作用域限制了其在连接池中的使用。作者建议借鉴Redis协议的优点,引入显式配置阶段、幂等性键以及全局预处理语句标识符等机制,以简化开发流程并提高数据库客户端的可靠性。这将改善开发体验,并提升数据库的易用性。

阅读更多
开发

HTTP/2:为什么在Ruby HTTP服务器中它并不重要

2025-02-25

本文探讨了HTTP/2协议在Ruby HTTP服务器(例如Puma)中的应用价值。作者认为,HTTP/2的主要优势在于通过多路复用提高互联网环境下的页面加载速度,但在局域网环境中,其优势并不明显。由于局域网内的往返时间极短,并且连接通常保持较长时间,因此TCP慢启动的影响微乎其微。此外,HTTP/2的“服务器推送”功能已被证明弊大于利,已被更优雅的103 Early Hints取代。作者建议将HTTP/2的处理留给负载均衡器或反向代理,以简化应用服务器的部署和维护,提高效率。

阅读更多
开发

Rails 应用:IO 密集型的神话?

2025-01-25

许多人认为 Rails 应用是 IO 密集型的,数据库是性能瓶颈,Ruby 性能不重要。但这篇文章挑战了这一观点。作者认为,虽然数据库是扩展时的瓶颈,但这并不意味着应用大部分时间都在等待 IO。通过分析 YJIT 的效率提升以及常见的性能问题(例如缺少数据库索引),作者指出许多 Rails 应用实际上是 CPU 密集型的。文章还强调了 CPU 饥饿和 IO 等待之间的混淆,以及不同执行模型(异步、多线程、多进程)的选择取决于应用的 IO/CPU 比例。作者呼吁关注 Ruby 性能,并指出一些 Rails 代码可以优化以提高性能。

阅读更多
开发

Ruby JSON 性能优化:堆栈分配与内联函数的博弈

2025-01-02

本文是 Ruby JSON 优化系列的第四部分,作者通过一系列微基准测试和性能分析,深入探讨了如何优化 Ruby 的 JSON 序列化性能。文章重点关注了堆栈分配和内联函数的运用,通过将缓冲区从堆分配改为栈分配,以及巧妙地运用内联函数,最终提升了 JSON 序列化的速度,但同时也揭示了在追求微基准测试性能的同时,需要注意避免对实际应用性能的负面影响。

阅读更多
开发

Ruby JSON库性能优化:第一部分

2024-12-18

本文讲述了作者如何优化Ruby的JSON gem,使其成为速度最快的JSON解析器和生成器。作者并非使用复杂技术,而是通过剖析代码,应用简单的优化,例如避免冗余检查、优先检查更可能成立的条件、减少设置成本以及使用查找表等。这些优化不仅适用于C代码,也适用于Ruby代码。最终,这些优化显著提升了JSON gem的性能,使其与oj等替代方案相比毫不逊色,减少了使用monkey patch的必要性,并解决了oj带来的稳定性和兼容性问题。

阅读更多
开发