Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: perl -d:DProf (Re: HACKING-ja -> mknmz.in)



寺西です。

藤原 誠 / Makoto Fujiwara wrote:
> 
> 実は最近 これを試していて、例えば
> 
> %Time ExclSec CumulS #Calls sec/call Csec/c  Name
>  71.2   63.98 63.928   2909   0.0220 0.0220  File::MMagic::checktype_data
>  7.48   6.717 16.190   2909   0.0023 0.0056  mknmz::put_field_index
>  5.90   5.298  4.212  67063   0.0001 0.0001  IO::File::open
...
> のように (File::MMagic が大勢を占る)のがとても気になって
> でも、もっとこまるのは、実は、この時に NMZ.p, NMZ.pi が出来て
> いないことなのです。

HTMLやメール等のファイルを大量に処理した場合には、
File::MMagic::checktype_data に時間がかかるようですね。

それで、少し見てみたところ、

        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);
            }
        }

という部分があるのですが、これの $token を毎回作成しているのは
無駄ではないかと思います。たぶん、前処理でできると思うので、
少し(sort 分ぐらい)は速くなるのではないかと思います。
File::MMagic::new の最後に、前処理を入れれば良いでしょう。

なお、$self->{SPECIALS} は File::MMagic::addSpecials でも追加
されるので、ここでも $token の計算が必要になるでしょう。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E