[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 メーリングリストの案内