2006年10月25日

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

臼田です

On 2006/10/25, at 1:23, Tadamasa Teranishi wrote:

> 寺西です。
>
> SATOH Fumiyasu wrote:
>>

>> At Wed, 25 Oct 2006 00:29:36 +0900,
>> Yukio USUDA wrote:
>>> @@ -2343,10 +2344,11 @@
>>> my ($word) = @_;
>>> my $hash = 0;
>>> - for (my $i = 0; $word ne ""; $i++) {
>>> + my $i = 0;
>>> + while($word) {
>>
>> $word が「0」や「0000」などだとまずくないでしょう
>> か?
>
> 「0000」は大丈夫ですが、「0」はまずいでしょうね。

実行回数が多いところの判定処理はできるだけ軽いもの
にしておきたいと考えていましたが、たしかにまずいですね。

>
>> 「while (length($word)) {」だとどうでしょう?
>
> そもそもこれって、for と while の問題じゃないので
> すよね?
>
> $word ne "" を $word にするか、length($word) でや
> るかとかいう話
> ですよね?
> なら、
>
> for (my $i = 0; length($word); $i++) {
>
> ってことかな??
> # それとも for は while にすると速いってこと??

下記のようなもので気になったところを実際に変えてみて
試しています。
この場合は for を while にして 数%、
$word ne "" を length($word)
に変えて数%といった違いがでました。
mknmz 全体から見ると1%程度にしかならないのですぐにどう
しようというものではありません。
また、 Perl のバージョン等で実行時にどのように変換される
のかは違うでしょうから修正が意味がないということがある
かもしれません。

use Benchmark;

@Seed = (

);

timethese (100000,
{
test_a => q{
my $word = "test";

my $hash = 0;
for (my $i = 0; $word ne ""; $i++) {
$hash ^= $Seed[$i & 0x03][ord($word)];
$word = substr $word, 1;
}
my $tmp = $hash & 65535;
},
test_d => q{
my $word = "test";

my $hash = 0;
while (length($word)) {
$hash ^= $Seed[$i & 0x03][ord($word)];
$word = substr $word, 1;
}
my $tmp = $hash & 65535;
},
test_e => q{
my $word = "test";

my $hash = 0;
my $i = 0;
while($word ne "") {
$hash ^= $Seed[$i & 0x03][ord($word)];
$word = substr $word, 1;
$i++;
}
my $tmp = $hash & 65535;
},
}
);


>
> 実際、速度の違いはでるのかもしれませんが、こういった修正よりは、
> アルゴリズムの改善をした方が良いような気がします。

まったく、その通りです。ソースに目を通すきっかけが
欲しいのでちょっとずつ眺めるネタにしようというものです。

アルゴリズムという点では同じ箇所にある
$word = substr $word, 1;

chop($word);
にしてもハッシュ値の生成上は使えそうで処理も
少し軽そうに思えるのですが、よくわかりませんでした。

臼田幸生


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




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