進捗

参考リンク関連のバグ処理をひとまず完了。

smalldat形式による検索

以下で提案していた、レス部分を除いて検索する処理を実装してみたのだが、
http://d.hatena.ne.jp/www-db/20050726/p3

結果は…ほんのちょっとだけ速くなった。

Devel::Dprofを使って実行時間を計ってみた。*1

以下、通常の、レス部分も含めて検索する場合。

Total Elapsed Time = 1.909613 Seconds
  User+System Time = 1.751613 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 46.3   0.811  0.811    317   0.0026 0.0026  SOV::App::Getlog::__ANON__
 16.9   0.297  0.297      8   0.0371 0.0371  Storable::pretrieve
 6.22   0.109  0.109      1   0.1090 0.1090  SOV::App::Getlog::endPastlogSearch
 3.60   0.063  0.201     13   0.0048 0.0154  SOV::DB::BEGIN
 3.48   0.061  0.873    317   0.0002 0.0028  SOV::App::Getlog::nextPastlogSearch
 2.74   0.048  0.339     11   0.0043 0.0308  SOV::App::Getlog::BEGIN
 2.68   0.047  0.401      7   0.0067 0.0573  main::BEGIN
 2.63   0.046  1.352      1   0.0462 1.3525  SOV::App::Getlog::prt_searchlog
 1.83   0.032  0.032     10   0.0032 0.0032  LWP::UserAgent::BEGIN
 1.77   0.031  0.047      8   0.0039 0.0058  SOV::Output::BEGIN
 1.77   0.031  0.062      6   0.0052 0.0104  SOV::URL::BEGIN
 1.77   0.031  0.030      4   0.0077 0.0074  SOV::App::Getlog::getCurrentQuery
 0.91   0.016  0.016      3   0.0053 0.0053  vars::BEGIN
 0.91   0.016  0.016      3   0.0053 0.0053  CGI::BEGIN
 0.91   0.016  0.016     10   0.0016 0.0016  Exporter::as_heavy

以下、レス部分を除いて検索し、それに対するレスと孫レスを参照IDから検出する場合。

Total Elapsed Time = 1.458269 Seconds
  User+System Time = 1.301269 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 26.4   0.344  0.344    167   0.0021 0.0021  SOV::App::Getlog::__ANON__
 15.6   0.204  0.204      8   0.0255 0.0255  Storable::pretrieve
 8.45   0.110  0.839      1   0.1095 0.8390  SOV::App::Getlog::prt_searchlog
 6.07   0.079  0.371     11   0.0072 0.0337  SOV::App::Getlog::BEGIN
 5.99   0.078  0.078      1   0.0780 0.0780  SOV::App::Getlog::endPastlogSearch
 5.99   0.078  0.201     13   0.0060 0.0154  SOV::DB::BEGIN
 3.61   0.047  0.247      8   0.0059 0.0309  SOV::App::BEGIN
 2.46   0.032  0.093     11   0.0029 0.0085  SOV::Logdata::BEGIN
 2.46   0.032  0.047     10   0.0032 0.0047  LWP::UserAgent::BEGIN
 2.38   0.031  0.030     10   0.0031 0.0030  SOV::Utility::BEGIN
 2.38   0.031  0.432      7   0.0044 0.0617  main::BEGIN
 2.31   0.030  0.030     76   0.0004 0.0004  Exporter::import
 2.23   0.029  0.373    167   0.0002 0.0022  SOV::App::Getlog::nextPastlogSearch
 1.23   0.016  0.016      1   0.0160 0.0160  Config::AUTOLOAD
 1.23   0.016  0.016     10   0.0016 0.0016  CGI::_compile

下の場合、検索処理であるところのSOV::App::Getlog::nextPastlogSearch()およびSOV::App::Getlog::__ANON__の回数は減り、そのあとの、検索された投稿に対するレス投稿と孫レス投稿を検出する処理でそのぶんの処理時間がかかる(SOV::App::Getlog::prt_searchlog()内)。
わずかな実行時間の変化だが、メモリ使用量は約2分の1〜3分の1に減り、0.1秒の差でも30件積もれば3秒の差となるので、それなりの改善にはなったと思う。
でもやはりgrepというのは重くならざるを得ないのだなぁと感じる。*2

*1:perl -d:Dprof qwerty/getlog.cgi l=20050731;q=アニメ

*2:そのわりにはi-mirai http://i-mirai.dyndns.org:8007/cgi-bin/bbs.cgiの右上の検索機能はgrepレベルの確実さで非常に速いのだが……何が違うのだろうか。