ページの作成や編集にはユーザ登録が必要です。
高速化 search プラグイン
- 投稿者: ぐうます
- カテゴリ: 修正
- 優先度: 普通
- 状態: リリース済
- 日時: 2009年01月09日 22時32分47秒
内容
FSWiki 標準添付の search プラグインを改変して、検索速度を改善しました。
処理時間比較結果
投稿者自サイトにて、下記条件にて処理時間を比較してみた結果を示します。
- Wiki ページ数 = 843。
- 検索ワード = "asdfasdfasdfasdf" (最大処理時間になるように、どのページにも現れないワードを使用)。
- 「ページ内容も含める」にチェックして検索。
- Devel::DProf を使用してプロファイル取得。
- dprofpp の User+System Time にて処理時間を比較(10 回平均)。
比較結果:本改変版の処理時間は、オリジナル(FSWiki 3.6.3 無改造)の約 1/5。
Wiki | 処理時間 |
---|---|
FSWiki 3.6.3 無改造 | 1.63 sec |
本改変版 | 0.31 sec |
dprofpp の結果:FSWiki 3.6.3 無改造
----- Average ----- URL = wiki.cgi/farm1?word=asdfasdfasdfasdf&t=and&c=true&action=SEARCH Run on 2009-01-09 20:40:23 -- 2009-01-09 20:44:47 Count = 10 Total Elapsed Time = 2.581129 Seconds User+System Time = 1.634254 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 61.2 1.001 1.008 1686 0.0005 0.0005 Jcode::getcode 9.47 0.154 0.166 1686 0.0000 0.0000 Jcode::tr 3.62 0.059 0.072 845 0.0000 0.0000 Wiki::DefaultStorage::get_page 2.04 0.033 0.033 1686 0.0000 0.0000 Encode::XS::encode 1.98 0.032 0.128 9 0.0036 0.0142 main::BEGIN 1.87 0.030 1.353 1 0.0306 1.3537 plugin::search::SearchHandler::do_ action 1.76 0.028 0.061 1700 0.0000 0.0000 CGI::param 1.67 0.027 0.037 7 0.0039 0.0053 Util::load_config_hash 1.25 0.020 0.020 5058 0.0000 0.0000 Encode::XS::decode 1.24 0.020 0.020 6075 0.0000 0.0000 Wiki::config 1.22 0.020 0.054 2527 0.0000 0.0000 Wiki::can_show 1.03 0.016 0.027 5066 0.0000 0.0000 Encode::find_encoding 0.81 0.013 0.016 5066 0.0000 0.0000 Encode::getEncoding 0.75 0.012 0.015 1709 0.0000 0.0000 CGI::self_or_default 0.62 0.010 0.010 913 0.0000 0.0000 Util::url_encode
dprofpp の結果:本改変版
----- Average ----- URL = wiki.cgi/farm1?word=asdfasdfasdfasdf&t=and&c=true&action=SEARCH Run on 2009-01-09 22:09:43 -- 2009-01-09 22:13:23 Count = 10 Total Elapsed Time = 0.557810 Seconds User+System Time = 0.312497 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 13.4 0.041 0.045 845 0.0000 0.0000 Wiki::DefaultStorage::get_page 10.1 0.031 0.129 9 0.0035 0.0143 main::BEGIN 8.22 0.025 0.051 7 0.0036 0.0074 Util::load_config_hash 6.75 0.021 0.021 5393 0.0000 0.0000 Util::trim 6.14 0.019 0.050 2527 0.0000 0.0000 Wiki::can_show 4.70 0.014 0.096 1 0.0147 0.0967 plugin::search::SearchHandler::do_ action 4.32 0.013 0.013 5 0.0027 0.0027 CGI::_compile 3.84 0.012 0.012 6075 0.0000 0.0000 Wiki::config 3.45 0.010 0.059 3 0.0036 0.0196 Wiki::DefaultStorage::get_page_lis t 3.32 0.010 0.025 2527 0.0000 0.0000 Wiki::get_page_level 2.84 0.008 0.034 845 0.0000 0.0000 Wiki::get_page 2.40 0.007 0.030 8 0.0009 0.0038 Wiki::BEGIN 2.30 0.007 0.007 851 0.0000 0.0000 HTML::Template::param 2.17 0.006 0.006 22 0.0003 0.0002 Jcode::BEGIN 2.14 0.006 0.013 2527 0.0000 0.0000 Wiki::DefaultStorage::get_page_lev el
改変内容:plugin/search/SearchHandler.pm
- 半角英文字の小文字→大文字変換方法の変更:
- 変更前:Jcode->new()->tr('a-z','A-Z')
- 変更後:perl 組込み関数 uc()
- ループ内の処理のうち、ループ外に出せるものをループ外で処理するように変更。
- その他もろもろ。
半角英文字の小文字→大文字変換方法:変更の妥当性
FSWiki の search プラグインでは、検索ワードに半角英文字が含まれている場合、Wiki ページソース中の全ての半角英小文字を半角英大文字に変換してから検索を行います。その目的は、半角英文字の大文字・小文字を区別せずに検索することです。オリジナルの FSWiki では、この小文字→大文字変換に Jcode モジュールのメソッド Jcode->new()->tr('a-z','A-Z') を使用していますが、perl 組込み関数の uc() でも問題無いのではないかと考え、上記の処理時間比較で使用した Wiki の全 843 ページについて、2 つの変換方法を適用して結果を比較してみましたところ、
- 843 ページ中、4 ページにて変換方法による差が発生。
- 差が生じた 4 ページについて調べてみると、差は機種依存文字(丸の中に 1 など)の部分で発生。このとき、uc() では変換前後で機種依存文字に変化がないのに対し、Jcode->new()->tr('a-z','A-Z') では変換後に文字化けが発生するため、2 つの変換方法で差が生じた。すなわち、どちらかというと Jcode->new()->tr('a-z','A-Z') の方が問題あるように見える。
- 半角英文字の小文字→大文字変換については、2 つの変換方法に差は無し。
という結果を得ましたので、変換方法を uc() に変更しても問題無いと考えます。
本改変版の高速化要因と条件
本改変版による高速化は、半角英文字の小文字→大文字変換方法の変更に主に起因しています。前掲の「dprofpp の結果:FSWiki 3.6.3 無改造」を見ると、Jcode モジュール及びそれから呼び出される Encode モジュールのメソッド群が全処理時間の約 75 % を占めていることが分かります。よって、search プラグインの検索処理内で唯一の Jcode モジュールメソッド Jcode->new()->tr('a-z','A-Z') の使用を止めることにより、この分の処理時間が削減されます。また、Jcode->new()->tr('a-z','A-Z') の代わりに使用する uc() は perl 組込み関数のため、その処理時間は前掲の「dprofpp の結果:本改変版」に明示的には現れていませんが、plugin::search::SearchHandler::do_action() にその処理時間が含まれていますので、元の「FSWiki 3.6.3 無改造」の全処理時間の 1 % に満たない時間で uc() は処理できていることになります。したがって、半角英文字の小文字→大文字変換方法の変更だけで、全処理時間を約 1/4 にしているといえます。
以上のことから、本改変版による高速化効果が大きいのは半角英文字の小文字→大文字変換が実行される場合です。例えば、検索ワードの文字が全て全角文字である場合など、検索ワードに半角英文字が含まれない場合には半角英文字の小文字→大文字変換が元々実行されないので、処理時間短縮の効果は小さくなります。
本改変版を適用可能な FSWiki バージョン
検索フォームに、「ページ内容も含める」オプションが存在するバージョン(FSWiki 3.6.0dev1 以降)。
本改変版の構成とインストール
- 変更ファイル:SearchHandler.pm のみです。(変更元:FSWiki 3.6.3。改行は LF に変更済)
- インストール:SearchHandler.20090109.pm(613) をダウンロードし、ファイル名を SearchHandler.pm に変更して、オリジナルの plugin/search/SearchHandler.pm に上書きして下さい(念のため、オリジナルを別名保存した方がよいでしょう)。
注意
上記の処理時間比較結果は投稿者の自サイトにて得られたものであり、速度改善量は適用先の Wiki サイトに応じて異なります(例えば、Wiki ページ数が少ない Wiki サイトの場合、元々の検索処理量が小さいため、本改変版適用による改善効果は小さくなるでしょう)。適用しても効果がないと感じる場合には適用をお止め下さい。
更新履歴
- 2009-01-09版:SearchHandler.20090109.pm(613)
- 初版公開
ライセンス
オリジナルの search プラグインの改変なので、GPL。
コメント
- SearchHandler.pmを取り込ませていただきました。FSWiki 3.6.4でリリースされる予定です。 - たけぞう (2009年01月26日 00時35分22秒)
最終更新時間:2010年10月24日 00時47分20秒