07/04/12 17:27:12 NrgQlk+w0
Adblock Plus はどのようにフィルタを処理し、また如何なるフィルタがより高速なのか?
フィルタは内部的には全て正規表現に変換される(正規表現で書かれていないものであっても)。
例えば『ad*banner.gif|』は内部では『/ad.*banner\.gif$/』となる。
しかしながら Adblock Plus はチェックすべきフィルタがある時に
それらを全てひとつひとつチェックしたりはしない……そんなことをしても無駄に重くなるだけだ。
フィルタの正規表現への変換に際し、Adblock Plus はそれらからテキスト情報を抜き出そうとする。
必要なのは8文字のユニークな文字列("shortcut")である。
これはそれぞれのフィルタ内のアドレスから抜き出されたもので、
例えば『|URLリンク(ad.*)<)” か “URLリンク(ad)<)” のどれかを選ぶ
(これらはどれも本来のフィルタがマッチすべきアドレスにマッチする)。
不幸にもワイルドカード等で区切られて8文字も無いとか、正規表現で書かれているとかならこの shortcut は作れない。
全ての shortcut は検索テーブルに放り込まれ、それによって Adblock Plus は必要なフィルタを極めて効率的に呼び出せるようになる。
とあるアドレスをチェックする時には Adblock Plus はまずそれらの shortcut を検索する
(これは非常に速く終わり、また登録された shortcut の数にもほとんど影響を受けない)。
shortcut にヒットした場合にのみ本来のフィルタから変換された正規表現でチェックする。
また、shortcut を作れなかったフィルタに関してはひとつひとつチェックされる。
まとめ:どんなフィルタが速いのか?
・可能な限り正規表現は使わない(正規表現は問答無用に遅い)。
・8文字の直列した文字列(中にワイルドカード『*』のような特殊な文字が含まれない)を内包する
シンプルなフィルタを使うように心掛ける。そうでないフィルタは正規表現と同様に遅い。
・上記の『速い』フィルタはいくつあっても良い。数に関係なく処理時間は一定である。
つまり1個の正規表現よりも20個のシンプルなフィルタを使う方がマシである。
・というわけで、Deregifier(URLリンク(adblockplus.org))マジお勧め。