2006/09/27(水) [n年前の日記]
#10 [hns] hnsのlog.cgiを修正
URL→名前変換用ファイル url_map.txt に記述するのが面倒。なので、正規表現で記述もできるように log.cgi を修正。
url_map.txt 内の文字列はハッシュに格納・比較に用いられているので、処理速度は速いはず。それを考えると、正規表現とループで比較するのは、速度的には改悪になる可能性が高いのだけど。ただ、
url_map.txt 内の文字列はハッシュに格納・比較に用いられているので、処理速度は速いはず。それを考えると、正規表現とループで比較するのは、速度的には改悪になる可能性が高いのだけど。ただ、
- 似たようなURLが列挙されることで、url_map.txt のファイルサイズが肥大→メモリをより多く使ってしまっている可能性。
- 記述していく際の手間隙。
- 変換用ファイルの最初のほうに書いておけば変換は速くなる。
◎ 修正箇所をメモ。 :
自分なりに色々手を入れたところがある log.cgi なので、公式に配布されてるものとは違ってる可能性も高いのだけど。一応メモ。
ファイル名や、ワークの確保。
sub open_log { } 内に、ファイルを読み込む部分を追加。
sub referer { } 内のループ内に、比較部分を追加。
sub recent_ref { } のループ内に、比較部分を追加。
比較用の記述ファイル。conf/url_map_regexp.txt。
考えてみると、referer {} と recent_ref {} で、2回比較を行ってるんだな…。1回処理した結果をどこかに保存して、とかやれば、単純計算で、半分の処理時間で済みそうな。いや、それだとメモリを大量に使ってしまって、結局時間がかかってしまうかしら。
そもそも、どこらへんが処理速度のネックになってるんだろう。そこからしてよくわかってない。>自分。
ファイル名や、ワークの確保。
# URL -> 名前 への変換マップ・ファイル(正規表現) my $url_map_regexp = "$diaryDir/conf/url_map_regexp.txt";
my %urlnameregexp;
sub open_log { } 内に、ファイルを読み込む部分を追加。
if (-f $url_map_regexp) { open(URLMAPREGEXP,"$url_map_regexp") || die "Can't Open URLMapRegexp File: $url_map_regexp: $!"; while (<URLMAPREGEXP>) { CodeConv::toeuc(\$_); $urlnameregexp{$1} = $2 if (/^(\S+)\s+(.+)$/); } close(URLMAPREGEXP); }
sub referer { } 内のループ内に、比較部分を追加。
# 正規表現でURL->名前変換 my $refname = $_; my $fg = 0; foreach my $key ( keys %urlnameregexp ) { if ( /$key/ ) { $refname = " [regexp] " . $urlnameregexp{$key} . " [" . $1 . "]"; $fg = 1; last; } } if ( $fg == 0 && exists($urlname{$_})) { $refname = $urlname{$_}; }
sub recent_ref { } のループ内に、比較部分を追加。
# 正規表現でURL->名前変換 my $refname = $REFERER[$j]; my $fg = 0; foreach my $key ( keys %urlnameregexp ) { if ( $refname =~ /$key/ ) { $refname = " [regexp] " . $urlnameregexp{$key} . " [" . $1 . "]"; $fg = 1; last; } } if ($fg == 0 && exists($urlname{$REFERER[$j]})) { $refname = $urlname{$REFERER[$j]}; }
比較用の記述ファイル。conf/url_map_regexp.txt。
b.hatena.ne.jp/keyword/(.*)$ はてブ:キーワード正規表現部分と、名前を、スペースで区切って記述。後方参照用に1箇所だけ確保。
考えてみると、referer {} と recent_ref {} で、2回比較を行ってるんだな…。1回処理した結果をどこかに保存して、とかやれば、単純計算で、半分の処理時間で済みそうな。いや、それだとメモリを大量に使ってしまって、結局時間がかかってしまうかしら。
そもそも、どこらへんが処理速度のネックになってるんだろう。そこからしてよくわかってない。>自分。
◎ サブルーチンの頭で利用する変数を宣言してるところが多々見られてなんとなく疑問を持った。 :
これを、実際に変数が使われるブロックの中で宣言するようにしたら、多少は速度的に改善されたりしないだろうか。Cなんかだとレジスタの活用等に繋がる云々、なんて話が大昔はあったような記憶もあるし。と思ったが、スクリプト実行に先立ってコンパイル(ていうのかこの場合?)する際に最適化がされていて、その手の改変はあんまり関係なかったりする可能性もあるな。というかそのぐらいのことはしてそうな気もする。>Perl。
[ ツッコむ ]
以上です。