2006年10月25日

[Namazu-devel-ja 1320] Re: mknmzの処理時間短縮

寺西です。

Yukio USUDA wrote:
>
> この場合は for を while にして 数%、

こっちは for のままで良いような気はします。

> $word ne "" を length($word)
> に変えて数%といった違いがでました。

こっちは length() 使う方が一般的に速いということなら HACKING-ja.txt
に記述して、length() を使うのを推奨するというのでも良いと思います。

> アルゴリズムという点では同じ箇所にある
> $word = substr $word, 1;
> を
> chop($word);
> にしてもハッシュ値の生成上は使えそうで処理も
> 少し軽そうに思えるのですが、よくわかりませんでした。

chop と substr($string, 0, -1) のどっちが速いかということですね?

頭から計算するか、お尻から計算するかなので、使えるように修正する
ことは可能だとは思います。
hash の計算は普通頭から計算しますがそれよりは、hash値が異なること
で、hash の衝突率が変わる可能性はあります。
2バイトや3バイト文字で考えると、頭削るよりはお尻削る方が衝突率が
(ほんの気持ちだけ)上がりそうに思うので、hash 値としては質が下がる
ような気はします。

そこは、substr $word, 1; のままで、

for (my $i = 0; $word ne ""; $i++) {

for (my $i = 0; length($word); $i++) {

にする程度で良いのではないでしょうか?

ちなみに

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

は、確かに修正した方が良いと思います。
grep がとても無駄に見えますから。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E

_______________________________________________
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日 08:59
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/48203
トラックバック
コメント
コメントする




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