[Namazu-devel-ja 772] File::MMagic::checktype_data
Yukio USUDA
m6694ha392t @ asahi-net.or.jp
2005年 12月 15日 (木) 00:48:37 JST
臼田です
File::MMagic::XS というものがあるということで比較してみたところ
File::MMagic::XS には File::MMagic::checktype_data 相当の処理が
ないので速度が違って当然ということがわかったのですが、処理時間が
かなり違うのでもう少し何とかなるだろうと思って調べてみました。
大分前ですが
File::MMagic::checktype_data の処理がかなり時間を取っている
http://www.namazu.org/ml/namazu-devel-ja/msg03123.html
という話題もありましたが、
選択パターン m/(aa|bb|cc|)/mg;
となっているところを
m/aa/mg; m/bb/mg; m/cc/mg;
と展開したところ
File::MMagic::checktype_data が10倍ぐらい速くなりました。
(SPECIALSのパターンに最後にマッチした部分がファイル先頭に近い
部分のものを採用するという判定部分について良くわからなかったので
下記パッチでは、パターンにマッチした回数が多いものを採用する
というように変えてみました)
$ diff -u MMagic.pm.org MMagic.pm
--- MMagic.pm.org 2005-08-28 00:20:31.000000000 +0900
+++ MMagic.pm 2005-12-14 23:13:31.000000000 +0900
@@ -678,20 +678,20 @@
{
# in BSD's version, there's an effort to search from
# more specific to less, but I don't do that.
- my ($token, %val);
+ my %val;
foreach my $type (keys %{$self->{SPECIALS}}) {
- my $token = '(' .
- (join '|', sort {length($a) <=> length($b)} @{$self->{SPECIALS}->{$type}})
- . ')';
- my $tdata = $data;
- if ($tdata =~ /$token/mg) {
- $val{$type} = pos($tdata);
- }
+ my $count=undef;
+ foreach my $token (@{$self->{SPECIALS}->{$type}}){
+ while ($data =~ /$token/mg) {
+ $count++;
+ }
+ }
+ $val{$type} = $count if $count;
}
# search latest match
if (%val) {
- my @skeys = sort { $val{$a} <=> $val{$b} } keys %val;
+ my @skeys = sort { $val{$b} <=> $val{$a} } keys %val;
$mtype = $skeys[0];
}
これで mknmz も1.5から2倍は速くなるだろうと思っていたのですが
[checktype_data 変更前のdprofpp -u]
Total Elapsed Time = 674.1436 Seconds
User Time = 661.1336 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
50.5 333.9 374.44 80866 0.0041 0.0046 File::MMagic::magicMatchStr
20.5 135.8 136.13 755 0.1800 0.1803 File::MMagic::checktype_data
6.13 40.52 40.526 80866 0.0005 0.0005 File::MMagic::readMagicLine
2.60 17.20 17.204 261074 0.0001 0.0001 mknmz::hash
2.56 16.93 16.934 63247 0.0003 0.0003 Text::Kakasi::do_kakasi
2.20 14.56 14.565 2910 0.0050 0.0050 mknmz::wordcount_sub
2.18 14.42 31.626 525 0.0275 0.0602 mknmz::make_phrase_hash
2.07 13.66 13.667 525 0.0260 0.0260 html::get_title_attr
1.93 12.72 12.727 525 0.0242 0.0242 html::get_alt_attr
1.27 8.418 382.98 755 0.0112 0.5073 File::MMagic::checktype_magic
0.86 5.695 42.034 525 0.0108 0.0801 mknmz::count_words
0.82 5.415 5.415 1050 0.0052 0.0052 NKF::nkf
0.73 4.808 6.616 2 2.4042 3.3081 mknmz::write_phrase_hash_sub
0.72 4.735 4.735 1050 0.0045 0.0045 gfilter::line_adjust_filter
0.67 4.427 4.427 170523 0.0000 0.0000 html::element_space
[checktype_data 変更後のdprofpp -u]
Total Elapsed Time = 535.1747 Seconds
User Time = 525.3047 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
63.4 333.2 372.32 80866 0.0041 0.0046 File::MMagic::magicMatchStr
7.44 39.08 39.084 80866 0.0005 0.0005 File::MMagic::readMagicLine
3.18 16.70 16.709 63247 0.0003 0.0003 Text::Kakasi::do_kakasi
3.04 15.96 15.963 261074 0.0001 0.0001 mknmz::hash
2.60 13.66 13.661 2910 0.0047 0.0047 mknmz::wordcount_sub
2.58 13.56 13.567 525 0.0258 0.0258 html::get_title_attr
2.58 13.54 29.512 525 0.0258 0.0562 mknmz::make_phrase_hash
2.40 12.60 12.607 525 0.0240 0.0240 html::get_alt_attr
1.46 7.685 380.11 755 0.0102 0.5035 File::MMagic::checktype_magic
1.31 6.874 7.102 755 0.0091 0.0094 File::MMagic::checktype_data
1.09 5.747 40.522 525 0.0109 0.0772 mknmz::count_words
1.03 5.423 5.423 1050 0.0052 0.0052 NKF::nkf
0.80 4.216 5.921 2 2.1079 2.9606 mknmz::write_phrase_hash_sub
0.80 4.213 4.213 1050 0.0040 0.0040 gfilter::line_adjust_filter
0.76 3.993 7.480 525 0.0076 0.0142 html::remove_html_elements
以前のレポートで最も処理時間がかかっていた
File::MMagic::checktype_data 以上に
File::MMagic::magicMatchStr が処理時間を取っています。
使っている perl のバージョンv5.8.2と関係があるのかもしれませんが
呼び出し回数がかなり多いところなのでなんとか処理を軽くしたいところです。
臼田幸生
Namazu-devel-ja メーリングリストの案内