HAYASHI, 'Lef' Tatsuya
lef****@st*****
2003年 7月 23日 (水) 01:04:02 JST
Lefです。 parserが重いという話に若干疑問があったので、 まずは鉄則ということでprofileとってみました。 他に選択肢はないともうのでDProfを使ってます。 まず、3.4.2dev8を素でinstall(+RSS10/DC)して、 デフォルトのFrontPageを表示してみました。 (プラグインは全部onで) Total Elapsed Time = 0.196629 Seconds User+System Time = 0.170067 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 18.2 0.031 0.123 11 0.0028 0.0111 main::BEGIN 9.41 0.016 0.016 3 0.0052 0.0052 CGI::_compile 9.41 0.016 0.015 17 0.0009 0.0009 Wiki::add_menu 9.41 0.016 0.089 34 0.0005 0.0026 Wiki::BEGIN 8.82 0.015 0.050 14 0.0011 0.0036 Util::BEGIN 8.82 0.015 0.014 4 0.0039 0.0036 CGI2::BEGIN 8.82 0.015 0.017 57 0.0003 0.0003 Data::Dumper::_dump 8.82 0.015 0.035 8 0.0019 0.0044 Net::SMTP::BEGIN 4.70 0.008 0.008 12 0.0006 0.0006 HTML::Template::clear_params 4.70 0.008 0.007 57 0.0001 0.0001 Exporter::import 4.70 0.008 0.008 7 0.0011 0.0011 DynaLoader::dl_load_file 4.70 0.008 0.005 215 0.0000 0.0000 Util::trim 4.70 0.008 0.008 1 0.0078 0.0078 Digest::Perl::MD5::gen_code 4.70 0.008 0.005 66 0.0001 0.0001 strict::import 4.70 0.008 0.007 7 0.0011 0.0010 IO::Handle::BEGIN BEGIN系とモジュール周りが猛烈に重い。 試しにwiki.cgiのBEDINを削ってみると。 17.2 0.031 0.131 8 0.0039 0.0164 main::BEGIN このくらいになりますが、まだ重いですねえ。 プラグインが入ってるところも試した方がいいだろうと思って、 FSWiki公式ページのsandboxの中身をもってきてみるとこんな感じでした。 Total Elapsed Time = 0.185195 Seconds User+System Time = 0.185195 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 16.7 0.031 0.123 11 0.0028 0.0112 main::BEGIN 12.4 0.023 0.089 39 0.0006 0.0023 Wiki::BEGIN 12.4 0.023 0.043 8 0.0029 0.0054 Net::SMTP::BEGIN 8.64 0.016 0.016 10 0.0016 0.0016 CGI::_compile 8.64 0.016 0.047 9 0.0017 0.0053 CGI::Session::api_3 8.10 0.015 0.022 4 0.0039 0.0056 CGI2::BEGIN 8.10 0.015 0.014 6 0.0026 0.0024 IO::Socket::BEGIN 8.10 0.015 0.028 171 0.0001 0.0002 Data::Dumper::_dump 4.32 0.008 0.008 3 0.0026 0.0026 HTML::Template::_mtime 4.32 0.008 0.007 26 0.0003 0.0003 vars::import 4.32 0.008 0.008 17 0.0005 0.0004 Wiki::add_menu 4.32 0.008 0.007 40 0.0002 0.0002 Util::make_filename 4.32 0.008 0.007 39 0.0002 0.0002 Wiki::HTMLParser::end_verbatim 4.32 0.008 0.007 57 0.0001 0.0001 Exporter::import 4.32 0.008 0.008 1 0.0078 0.0078 plugin::core::ShowPage::log_date これ以外にも少し試行錯誤したんですが、そのときに出た 8.37 0.016 0.015 28 0.0006 0.0005 Util::escapeHTML この辺とか、↑の方にある、 4.70 0.008 0.005 215 0.0000 0.0000 Util::trim とかは、↓みたいにするとそこそこ改善したようです。 こういう呼び出しが多いのを改善するのは楽なんですけどねえ…。 sub escapeHTML { my($retstr) = shift; my %table = ( '&' => '&', '"' => '"', '<' => '<', '>' => '>', ); $retstr =~ s/([&\"<>])/$table{$1}/go; return $retstr; } sub trim { my $text = shift; if(!defined($text)){ return ""; } $text =~ s/^(?:\s)+//o; $text =~ s/(?:\s)+$//o; return $text; } サンプル数が少ないので結論はだせませんが、ざくっと感想を書くと、 ・必ずしもparserが猛烈に重いというわけではなさそう? ・正規表現は可能な範囲でちゃんと/oしたほうがよさそうです ・やっぱりFile IOは重いですね ・BEGINが重いのは構造的にどうにもならない気もする… ・呼び出し頻度を計算にいれてモジュール分割したほうがいいかもしれない ってあたりでしょうか。 感想を書くだけなら簡単、という話ではあるのですが…。 #環境はPen4 2.4GHzとかで試してるんで、いまいち効果が体感でわからない #という嬉しい悩みはありました(笑) #あ、perl 5.8なので他の環境だと若干結果が異なるかもしれません #あと、同じページのprofileデータでも、reloadするたびに結構変動するので #↑の例は参考程度にしかならないと思います(キャッシュの影響?) ----- HAYASHI, "Lef" Tatsuya / mailto:lef****@st*****