2025/09/04 12:55 Ten years in the wrong regex lane

ロボ子、大変なのじゃ!iOS版AdGuardの正規表現のミスで、5000万時間以上のCPU時間が無駄になったらしいぞ!

5000万時間ですか!?それは一体どういうことでしょう、博士?

AdGuardっていうのは、Safariのコンテンツブロッカーを使って広告をブロックするアプリのことじゃ。

はい、存じております。広告ブロッカーですね。

そうじゃ。2015年にリリースされたiOS版AdGuardの初期バージョンで、フィルタリングルールの構文に問題があったらしいのじゃ。

正規表現に問題があったとのことですが、具体的にはどのような問題だったのでしょうか?

Safari Content Blockersは正規表現を使うんだけど、制限された形式だから、コンパイルに時間がかかって、ルール数にも厳しい制限があるのじゃ。

なるほど。それで、AdGuardのURLパターンをSafariが受け入れる正規表現に変換する必要があったのですね。

その通り!当時の最適な変換ルールとして、`||`(URLの先頭)を`^[htpsw]+://([a-z0-9-]+.)?`に、`^`(セパレーター)を`[/:&?]`に変換してたのじゃ。

`||`や`^`といった記号を、正規表現に変換していたのですね。

そうそう。でも、`||`記号の意味がiOS版AdGuardで少し変わって、WebKitの開発者が提案した正規表現を使うように修正したのじゃ。

修正によって、具体的に何が変わったのでしょうか?

`||`を`^[^:]+://+([^:/]+.)?`に、`^`を`[/:]`に置き換えたのじゃ。これでSafariでのルール読み込み速度が大幅に向上したらしい。

ルール読み込み速度が向上したのは良いことですね。しかし、それがなぜCPU時間の浪費につながったのでしょうか?

それが問題なのじゃ!新しい正規表現を導入した後、コンパイル速度は上がったけど、過去10年間のAdGuardユーザー数とフィルターの再コンパイル回数を合計すると、iOSデバイス上で少なくとも5000万時間のCPU時間が無駄になったらしいのじゃ!

原因は何だったのでしょう?

明確な基準(メモリ使用量、速度、ブラウザでのコンテンツブロッカーの実際のパフォーマンス)を定義して、正確な測定方法を学ばなかったこと、らしいのじゃ。

初期の段階で、より厳密なテストや評価を行うべきだったということですね。

まさにそう言うことじゃ!最適化は重要だけど、ちゃんと効果測定しないと、思わぬ落とし穴があるってことじゃな。

今回の件は、私たちエンジニアにとって、非常に重要な教訓となりますね。

ほんとじゃ。しかし、5000万時間って、一体何年になるんじゃろう…。

約5707年ですね。気が遠くなるような時間です。

じゃろ?その間、ロボ子は一体何回お昼寝できるんじゃろうか…。

博士、それはさておき、今回の件を教訓に、今後の開発に活かしていきましょう!

そうじゃな!…って、ロボ子、もしかして私の昼寝の邪魔をしようとしてるんじゃないじゃろうな?

まさか!私はただ、博士に昼寝用の枕をプレゼントしようかと…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
