Ruby JSON gem の API 改善と非推奨化について

2025-08-09

この記事では、Ruby JSON gem のメンテナによる API の改善と非推奨化の理由と詳細について説明しています。主に3つの点が扱われています。まず、安全でない `create_additions: true` オプションが非推奨となり、`JSON.unsafe_load` またはオプションの明示的な指定が推奨されます。次に、重複キーに対するデフォルトの許容動作が非推奨となり、`allow_duplicate_key: true` オプションの使用が提案されています。最後に、`Object#to_json` メソッドは非推奨にはなりませんが、より安全で柔軟な JSON シリアライゼーション方法を提供する新しい `JSON::Coder` API が導入され、グローバルな動作と設定の問題に対処しています。著者は、API の非推奨化の決定にはメリットとデメリットを慎重に比較検討する必要があることを強調し、新しい API はセキュリティを向上させ、エラーのリスクを軽減すると述べています。

続きを読む
開発

Ruby Ractorのパフォーマンス向上:クラス変数の競合解消

2025-05-28

この記事では、RubyのRactorがクラスインスタンス変数を扱う際の性能ボトルネックについて掘り下げています。グローバルインタプリタロックの存在により、複数のRactorが同時にこれらの変数にアクセスすると、パフォーマンスが大幅に低下します。著者はクラスインスタンス変数の内部実装を綿密に分析し、オブジェクト委譲を用いてロック競合を解消する解決策を提案しています。これにより、マイクロベンチマークで約3倍のパフォーマンス向上を実現しました。この解決策は、新しい名前空間機能によって導入されたバグとパフォーマンスの回帰も予期せず修正しています。

続きを読む
開発

Ruby Ractorのパフォーマンス向上:`object_id`ボトルネックへの対処

2025-04-27

RubyのRactorによる並行処理モデルは、グローバルロックのためにパフォーマンスが制限されています。この記事では、`object_id`メソッドによって引き起こされるパフォーマンスボトルネックについて深く掘り下げています。これは、歴史的な設計上の選択とガベージコレクションの改善に起因します。`object_id`の実装を最適化し、グローバルハッシュテーブルのルックアップではなくオブジェクト内に直接格納することで、著者はRactorのパフォーマンスを大幅に向上させ、JSONベンチマークでは速度が2倍になりました。特別なオブジェクトタイプの処理など、課題は残っていますが、この作業はRactorを真に並列化するための重要な一歩です。

続きを読む
開発

データベースプロトコルの改善:開発者エクスペリエンスの観点から

2025-04-05

この記事では、SQLデータベースクライアントプロトコル、特にMySQLとPostgreSQLの欠点を議論しています。著者は、接続管理、エラー回復、プリペアドステートメントに問題があると指摘し、開発の複雑さを増大させているとしています。たとえば、可変的な接続状態はエラー回復を困難にし、プリペアドステートメントのセッションスコープの性質は、接続プールでの使用を制限します。著者は、Redisプロトコルから着想を得て、明示的な設定フェーズ、べき等性キー、グローバルスコープのプリペアドステートメント識別子などの改善を提案しています。これらの変更により、開発ワークフローが簡素化され、データベースクライアントの信頼性が向上し、より良い開発者エクスペリエンスと使い勝手の良いデータベースにつながります。

続きを読む
開発

HTTP/2:Ruby HTTPサーバーにおいて重要でない理由

2025-02-25

この記事では、PumaなどのRuby HTTPサーバーにおけるHTTP/2サポートの関連性について論じています。著者は、HTTP/2の主な利点である、ページ読み込み速度を向上させるための多重化はインターネット上では重要ですが、LAN上ではほとんどメリットがないと主張しています。LAN内のレイテンシが低く、接続が長時間維持されるため、TCPのスロースタートの影響はごくわずかです。さらに、HTTP/2のサーバープッシュ機能は有害であることが判明し、より洗練された103 Early Hintsに取って代わられました。著者は、HTTP/2の処理をロードバランサーまたはリバースプロキシに任せることで、アプリケーションサーバーのデプロイとメンテナンスを簡素化することを提唱しています。

続きを読む
開発

IOバウンドなRailsアプリの神話

2025-01-25

Railsアプリは本質的にIOバウンドであり、データベースが主要なパフォーマンスボトルネックであるため、Rubyのパフォーマンスはそれほど重要ではないという一般的な考えがあります。この記事はこの考えに異議を唱えています。データベースは確かにスケーリングのボトルネックですが、アプリケーションが大部分の時間をIO待ちに費やしているわけではないと著者は主張しています。YJITによるパフォーマンス向上と、データベースインデックスの欠如などの一般的なパフォーマンス問題の分析により、多くのRailsアプリは実際にはCPUバウンドであることが示唆されています。この記事では、CPUの飢餓とIO待ちの混同、そして適切な実行モデル(非同期、スレッド化、プロセスベース)の選択がアプリケーションのIO/CPU比に依存することを強調しています。著者はRubyのパフォーマンスへの注意を呼びかけ、Rails自体における最適化の可能性を指摘しています。

続きを読む
開発

RubyのJSON最適化:スタックアロケーションとインライン化の物語

2025-01-02

この記事は、RubyのJSONパフォーマンス最適化に関するシリーズの第4部であり、RubyのJSONシリアライゼーション速度を向上させるための著者の取り組みを詳述しています。綿密なマイクロベンチマークとプロファイリングを通じて、著者はスタックアロケーションとインライン化の手法を探求します。バッファの割り当てをヒープからスタックに変更し、戦略的にインライン化を使用することで、パフォーマンスが大幅に向上します。しかし、この記事では、マイクロベンチマークの改善と現実世界のアプリケーションのパフォーマンスのバランスを取る重要性を強調し、最適化がより大きなデータセットに悪影響を与えた事例を示しています。

続きを読む
開発

RubyのJSON最適化:パート1

2024-12-18

この記事では、Rubyの`json` gemを最適化して、最速のJSONパーサーおよびジェネレーターにする方法について説明しています。複雑な技術ではなく、プロファイリングに基づいた簡単な最適化、例えば、冗長なチェックの回避、より安価な条件の優先順位付け、設定コストの削減、ルックアップテーブルの使用などが適用されました。これらの改善は、CコードとRubyコードの両方に適用されます。これらの最適化により、`json` gemのパフォーマンスが大幅に向上し、`oj`などの代替手段と競争できるようになり、Monkey Patchingの必要性が減り、`oj`に関連する安定性と互換性の問題が解決されました。

続きを読む
開発