[Fswiki-dev] profile

Back to archive index

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 = (
		'&' => '&',
		'"' => '"',
		'<' => '&lt;',
		'>' => '&gt;',
	);
	$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*****




Fswiki-dev メーリングリストの案内
Back to archive index