トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/396

ページの作成や編集にはユーザ登録が必要です。

高速化 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秒)
お名前: コメント:
SearchHandler.20090109.pm

最終更新時間:2010年10月24日 00時47分20秒