フィクスチャファイルの検索パターンを最適化し約50%高速化
Active Recordのフィクスチャ読み込み時のglobパターンを簡素化することで、処理速度を約50%改善しました。変更はわずか1行ですが、シンプルさと性能向上を同時に実現しています。
背景
この変更は、より大きなテスト関連の改善プロジェクト #57326 の過程で特定されたパフォーマンス問題を解決するために切り出されたものです。フィクスチャファイルの検索処理がボトルネックとなっており、その改善を単独のPRとして独立させることで、大きな変更を待たずに取り込める形に整理されました。
PR本文では「Roughly 50% faster, but also much simpler(約50%高速で、かつはるかにシンプル)」と説明されており、パフォーマンス改善とコードの可読性向上という2つの目標を同時に達成しています。
技術的な変更
activerecord/lib/active_record/fixtures.rb の read_fixture_files メソッドで使用されるglobパターンが1文字の変更で簡素化されました。
変更前:
yaml_files = Dir["#{path}{.yml,/{**,*}/*.yml}"].select { |f|
::File.file?(f)
}
変更後:
yaml_files = Dir["#{path}{.yml,/**/*.yml}"].select { |f|
::File.file?(f)
}
旧パターンの /{**,*}/*.yml は「任意の深さのディレクトリ(**)またはシングルセグメント(*)配下のYMLファイル」を意図した表現ですが、** はゼロ個以上のディレクトリセグメントにマッチするため * の指定は冗長です。新パターンの /**/*.yml は ** によってあらゆる深さのサブディレクトリを網羅するため、動作に変化なく表現を簡潔にできます。
この単純化によって、ファイルシステム探索のオーバーヘッドが削減され、約50%の高速化が実現されています。
設計判断
最小限の変更で最大の効果を得る方針が採られています。フィクスチャのキャッシュ機構やファイル読み込みのロジックには手を加えず、globパターンの冗長性を除去するだけで大幅な改善を達成しています。
PR本文で「much simpler」と言及されているとおり、コードの可読性向上も同時に実現しています。{**,*} という複雑な表現の代わりに ** 単独で同じ意味を表現でき、意図がより明確になりました。また、本変更を独立したPRとして切り出したこと自体も重要な判断です。より大きな改善プロジェクト(#57326)の完成を待たず、単独で価値を持つ改善として早期に取り込める形に整理されています。
まとめ
1文字の変更でglobパターンの冗長性を取り除き、フィクスチャ読み込みを約50%高速化した本PRは、「シンプルさと性能は同時に達成できる」ことを示す好例です。複雑なキャッシュ戦略に頼らずパターンの簡素化で解決しており、Rails全体のテスト体験の改善に貢献します。