namazu-ml(avocado)


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

jcode.pl vs nkf (Re: Plan for Namazu next version)



高林です

Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> wrote:

> nkf を呼び出すのと jcode.pl で処理するのとどちらが速いかは明
>日に計測してみます。極端に jcode.pl の方が遅ければ問題ですが、そん
>なことは多分ないと思います。

計測してみました。結果は

$perl jcode_vs_nkf.pl manual.html

Benchmark: timing 10 iterations of jcode, nkf...
     jcode: 35 secs (34.66 usr  0.14 sys = 34.80 cpu)
       nkf:  2 secs ( 0.54 usr  0.18 sys +  1.12 cusr  0.46 csys =  2.30 cpu)

のように極端に jcode.pl を使った場合の方が遅いということが判明しま
した。&jcode::trans で JIS X208 英数字記号を ASCII に変換している
部分をコメントアウトすると

Benchmark: timing 10 iterations of jcode, nkf...
     jcode: 13 secs (13.08 usr  0.12 sys = 13.20 cpu)
       nkf:  2 secs ( 0.50 usr  0.12 sys +  1.03 cusr  0.67 csys =  2.32 cpu)

と、だいぶましになりますが、それでもまだ遅いです。できれば nkf を
使うのをやめて jcode.pl に統一したかったのですが (そうすれば 
UNIX/Win32 のコードを統一できる)、この結果をみると、 nkf を使った
方が良いみたいです。

Win32 だと 

    open(FILE ,"|nkf -j >$file") 

のようにパイプを通してファイルに書き出すことがうまくいかないんです。

    open(FILE ,"nkf -e $file|")

のようにパイプを通して読み込むことはできるんですけどね。だから 
Win32 用に変なコードを書かないといけなかったのです。

…と、ここまで書いてふと思って Win32 で実験してみたところ、 $file 
のパスを /tmp/hoge.out みたいに / で区切ると失敗して、
\tmp\hote.out のように \ で指定するとうまくいくことが分かりました。
これならなんとかなりそうです。こんな感じでいいですよね? > 広瀬さん。


ちなみに、テスト用に作ったプログラムは以下のようなものです。サンプ
ルに使った manual.html は約 67KB で JIS コードで保存されています。

#!/usr/bin/perl

use Benchmark;
require 'jcode.pl';

$file = $ARGV[0];

# &nkf   if ($ARGV[1] eq "nkf" );
# &jcode if ($ARGV[1] eq "jcode" );

timethese(10, {nkf => '&nkf', jcode => '&jcode' });

sub nkf {
    open(IN,  "nkf -eZ1 $file |");
    open(OUT, "|nkf -s > $file.out");
    @tmp = <IN>;
    $tmp = join('', @tmp);
    $tmp =~ tr/a-z/A-Z/;
    print OUT $tmp;
    close(IN);
    close(OUT);
}

sub jcode {
    open(IN,  "$file");
    open(OUT, "> $file.out");
    @tmp = <IN>;
    $tmp = join('', @tmp);
    $tmp = &jcode'euc($tmp, 'jis', 'z');
    $tmp = &jcode::trans($tmp, '0-9A-Za-z !”#$%&’()*+,−./:;<=>?@「¥」^_`{|} ̄', '0-9A-Za-z !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~');
    $tmp =~ tr/a-z/A-Z/;
    $tmp = &jcode'sjis($tmp, 'euc');
    print OUT $tmp;
    close(IN);
    close(OUT);
}

--
高林 哲 Satoru Takabayashi