Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Web
とか、アルファブロガーさん的なタイトルにしてみたりして(笑)。

えっと、FSWiki の検索の遅さにウンザリして、検索時の動作をプロファイルしたよ。Perl のバージョンは 5.8.8。

テスト環境では、およそ 800 ページ・200 行/ページ(同一内容)の日本語・英語混在文章を対象にした。
さらに、その中の 1 ページにだけ「My Search Keyword」というキーワードを書く。

この状態で、「My Search Keyword」というキーワードで AND 検索を行った時の結果がこちら。
(なお、pagelist.cache は生成済みの状態です。)
================================================
Total Elapsed Time = 8.040466 Seconds
User+System Time = 8.040466 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
80.5 6.478 6.476 3216 0.0020 0.0020 Jcode::getcode
5.75 0.462 0.397 3216 0.0001 0.0001 Jcode::tr
5.67 0.456 0.456 4818 0.0001 0.0001 Encode::XS::encode
2.61 0.210 0.213 807 0.0003 0.0003 Wiki::DefaultStorage::get_page
1.26 0.101 6.640 3216 0.0000 0.0021 Jcode::set
1.26 0.101 0.101 9648 0.0000 0.0000 Encode::XS::decode
... (以下略)
================================================

ここから、ページのエンコードを自動判定する Jcode::getcode に時間を食っていることが分かります。

Jcode::getcode は、Jcode のオブジェクト生成時にエンコードを指定しない場合に呼び出されます。
英語・日本語混在時など、エンコードの判定が難しい場合は特に処理が長引く傾向にあります。
現在のところ、FSWiki のページデータのエンコードは EUC-JP で固定なので、これを決め打てばこのルーチンはまるまる起動されないことになるでしょう。

ということで、こんな感じで修正します(行番号は 3.6.3-dev3 を基準)。
================================================
[plugin/search/SearchHandler.pm] の 66 行目:
- my $page2 = ($word =~ /[A-Za-z]/) ? Jcode->new($page)->tr('a-z','A-Z') : undef;
+ my $page2 = ($word =~ /[A-Za-z]/) ? Jcode->new($page, 'EUC-JP')->tr('a-z','A-Z') : undef;
================================================

上記修正後、改めてプロファイリングすると…
================================================
Total Elapsed Time = 2.024995 Seconds
User+System Time = 2.024995 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
47.5 0.962 0.937 3216 0.0003 0.0003 Jcode::tr
22.0 0.446 0.446 4818 0.0001 0.0001 Encode::XS::encode
9.93 0.201 0.201 9648 0.0000 0.0000 Encode::XS::decode
4.94 0.100 0.093 807 0.0001 0.0001 Wiki::DefaultStorage::get_page
2.52 0.051 0.077 1615 0.0000 0.0000 CGI::cookie
2.47 0.050 0.050 3238 0.0000 0.0000 CGI::Util::rearrange
... (以下略)
================================================

ということで、6 秒以上も高速化に成功! 正月から目出度いですね。
みんなも試してみてねー。早くならなかったらゴメンヨ

 *

訂正(20:44): 修正後のプロファイリングの結果、違うものを掲載してしまっていたので差し替えました。
(間違えて掲載していたものでは、一時的に data ディレクトリを /dev/shm に置いていたので、Wiki::DefaultStorage::get_page が異常に速いことになっていました)

追記(20:48): どうせ EUC-JP 決め打ちなら Jcode 使わなくてもいいじゃん、という気もしてきた...。

Comments

Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: