2006年10月25日

[Namazu-devel-ja 1315] mknmz の処理時間短縮

臼田です。

mknmz の 処理時間がもう少し縮まらないかと
dprofpp で比率の多いところを探して手を加えてみています。

html と pdf で1200ほどのファイルを対象として
2.0.17 を試し下記のような結果になっています。

比較的時間を取っているサブルーチンを眺めてみて
いくつか気になる点を見かけました。

hash:
  for を while にし、 "" との比較を省略する
ことで判定箇所を削減
make_phrase_hash, wordcount_sub:
  配列に空白が入らないようにすることで余分な判定を削減
get_last_docid, adjust_first_docid:
  値渡しをレファレンス渡しに
  結果を使っていない式を削除

get_last_docid, adjust_first_docid への修正は効果があまりないよ
うですが
これらの修正をすることで3%ほどの処理時間短縮になりました。


【修正前】
[Base]
Date: Tue Oct 24 23:58:40 2006
Added Documents: 1,269
Size (bytes): 100,022,725
Total Documents: 1,269
Added Keywords: 50,227
Total Keywords: 50,227
Wakati: module_kakasi -ieuc -oeuc -w
Time (sec): 254
File/Sec: 5.00
System: darwin
Perl: 5.008006

Total Elapsed Time = 186.7891 Seconds
User+System Time = 108.9591 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
11.3 12.37 20.572 19 0.6515 1.0827 mknmz::write_phrase_hash_sub
9.43 10.28 10.280 873244 0.0000 0.0000 mknmz::hash
8.41 9.159 9.159 5089 0.0018 0.0018 mknmz::wordcount_sub
8.18 8.912 19.192 1269 0.0070 0.0151 mknmz::make_phrase_hash
6.94 7.563 7.563 144435 0.0000 0.0000 mknmz::readw
6.88 7.492 12.866 19 0.3943 0.6771 mknmz::write_index_sub
5.88 6.406 6.405 22160 0.0003 0.0003 File::MMagic::magicMatchStr
4.78 5.210 5.210 176718 0.0000 0.0000 Text::Kakasi::xs_do_kakasi
4.12 4.486 4.486 278933 0.0000 0.0000 mknmz::get_last_docid
3.52 3.835 3.835 865 0.0044 0.0044 html::get_title_attr
3.29 3.585 3.585 865 0.0041 0.0041 html::get_alt_attr
3.23 3.519 21.263 1269 0.0028 0.0168 mknmz::count_words
2.44 2.664 5.514 825 0.0032 0.0067 util::syscmd
2.20 2.395 2.395 2538 0.0009 0.0009 gfilter::line_adjust_filter
1.95 2.130 2.177 1283 0.0017 0.0017 File::MMagic::checktype_data

【修正後】
[Base]
Date: Wed Oct 18 00:22:59 2006
Added Documents: 1,269
Size (bytes): 100,022,725
Total Documents: 1,269
Added Keywords: 50,227
Total Keywords: 50,227
Wakati: module_kakasi -ieuc -oeuc -w
Time (sec): 240
File/Sec: 5.29
System: darwin
Perl: 5.008006

Total Elapsed Time = 171.0032 Seconds
User+System Time = 105.7832 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
11.7 12.46 20.436 19 0.6561 1.0756 mknmz::write_phrase_hash_sub
8.62 9.119 9.119 5089 0.0018 0.0018 mknmz::wordcount_sub
8.20 8.670 8.670 873244 0.0000 0.0000 mknmz::hash
7.10 7.512 16.182 1269 0.0059 0.0128 mknmz::make_phrase_hash
6.96 7.366 7.366 144385 0.0000 0.0000 mknmz::readw
6.18 6.542 12.686 19 0.3443 0.6677 mknmz::write_index_sub
6.05 6.396 6.415 22160 0.0003 0.0003 File::MMagic::magicMatchStr
4.89 5.170 5.170 176718 0.0000 0.0000 Text::Kakasi::xs_do_kakasi
4.25 4.498 4.498 278590 0.0000 0.0000 mknmz::get_last_docid
3.61 3.819 21.563 1269 0.0030 0.0170 mknmz::count_words
3.59 3.795 3.795 865 0.0044 0.0044 html::get_title_attr
3.38 3.575 3.575 865 0.0041 0.0041 html::get_alt_attr
2.78 2.944 5.774 825 0.0036 0.0070 util::syscmd
2.15 2.275 2.275 2538 0.0009 0.0009 gfilter::line_adjust_filter
2.08 2.198 2.198 278590 0.0000 0.0000 mknmz::adjust_first_docid


修正点は下記の通りです。


$ diff -u scripts/mknmz.in.org scripts/mknmz.in
--- scripts/mknmz.in.org 2006-05-01 13:12:27.000000000 +0900
+++ scripts/mknmz.in 2006-10-20 00:11:11.000000000 +0900
@@ -2236,12 +2236,13 @@
my %tmp = ();
$$contref =~ s!\x7f */? *\d+ *\x7f!!g; # remove tags of weight
$$contref =~ tr/\xa1-\xfea-z0-9 \n//cd; # remove all symbols
+ $$contref =~ s/^\s+//;
+ $$contref =~ s/\s+$//;
my @words = split(/\s+/, $$contref);
- @words = grep {$_ ne ""} @words; # remove empty words
my $word_b = shift @words;
my $docid = $docid_count + $docid_base;
for my $word (@words) {
- next if ($word eq "" || length($word) > $conf::WORD_LENG_MAX);
+ next if (length($word) > $conf::WORD_LENG_MAX);
my $hash = hash($word_b . $word);
unless (defined $tmp{$hash}) {
$tmp{$hash} = 1;
@@ -2303,8 +2304,8 @@
} else {
print $fh_tmp_pi pack("N", $ptr);
my $record = $PhraseHash{$i};
- my $last_docid = get_last_docid($baserecord, 1);
- my $adjrecord = adjust_first_docid($record,
$last_docid);
+ my $last_docid = get_last_docid(\$baserecord, 1);
+ my $adjrecord = adjust_first_docid(\$record,
$last_docid);
check_records(\$record, \$baserecord, 1) unless
defined $adjrecord; # namazu-bugs-ja#31
$record = $adjrecord;
my $n2 = length($record) + $baseleng;
@@ -2343,10 +2344,11 @@
my ($word) = @_;
my $hash = 0;
- for (my $i = 0; $word ne ""; $i++) {
+ my $i = 0;
+ while($word) {
$hash ^= $Seed[$i & 0x03][ord($word)];
$word = substr $word, 1;
- # $word =~ s/^.//; is slower
+ $i++;
}
return $hash & 65535;
}
@@ -2426,9 +2428,11 @@
# Don't do processing for nested symbols.
# NOTE: When -K is specified, all symbols are already removed.
+ $text =~ s/^\s+//;
+ $text =~ s/\s+$//;
my @words = split /\s+/, $text;
for my $word (@words) {
- next if ($word eq "" || length($word) > $conf::WORD_LENG_MAX);
+ next if (length($word) > $conf::WORD_LENG_MAX);
if ($var::Opt{'noedgesymbol'}) {
# remove symbols at both ends
$word =~ s/^[^\xa1-\xfea-z_0-9]*(.*?)[^\xa1-\xfea-z_0-9]*
$/$1/g;
@@ -2486,24 +2490,23 @@
}
sub get_last_docid ($$) {
- my ($record, $step) = @_;
- my (@data) = unpack 'w*', $record;
+ my ($recordref, $step) = @_;
+ my (@data) = unpack 'w*', $$recordref;
my $sum = 0;
for (my $i = 0; $i < @data; $i += $step) {
$sum += $data[$i];
}
- my $leng = @data / $step;
return $sum;
}
sub adjust_first_docid ($$) {
- my ($record, $last_docid) = @_;
- my (@data) = unpack 'w*', $record;
+ my ($recordref, $last_docid) = @_;
+ my (@data) = unpack 'w*', $$recordref;
$data[0] = $data[0] - $last_docid;
return undef if ($data[0] < 0); # namazu-bug-ja#31
- $record = pack 'w*', @data;
+ my $record = pack 'w*', @data;
return $record;
}
@@ -2540,8 +2543,8 @@
my $leng = length($record);
if ($current_word eq $words[$cnt]) {
- my $last_docid = get_last_docid($baserecord, 2);
- my $adjrecord = adjust_first_docid($record,
$last_docid);
+ my $last_docid = get_last_docid(\$baserecord, 2);
+ my $adjrecord = adjust_first_docid(\$record,
$last_docid);
check_records(\$record, \$baserecord, 2) unless
defined $adjrecord; # namazu-bugs-ja#31
$record = $adjrecord;
$leng = length($record); # re-measure

臼田幸生

_______________________________________________
Namazu-devel-ja mailing list
Namazu-devel-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja

投稿者 xml-rpc : 2006年10月25日 00:29
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/48188
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。