[Namazu-devel-ja 1493] Re: mknmz の add_key( ), make_phrase_hash() の負荷軽減
Tadamasa Teranishi
yw3t-trns @ asahi-net.or.jp
2007年 2月 22日 (木) 00:41:55 JST
寺西です。
Yukio USUDA wrote:
>
> 今回、適度な長さの文字列になった段階で配列にすれば、規模の大きい
> 文字列領域の移動によるガベージコレクション回数が減るのではと考え、
> 下記のスクリプトを作成して試してみました。
これは、ガベージコレクションの回数が減ることによる速度向上を期待した
ものという理解でよろしいですよね?
> メモリ量、OSの種類、Perlのバージョン等で違うと思われ
> ますが
> (同じ環境でも複数回試すと結果に大きくばらつきがでます)
> テスト用スクリプトでは
> 1.2〜3倍程度の処理時間の違いが出ました。
手元の環境ではそこまでの性能はでていませんが、このテストスクリプト
では、やや速くなっています。
> WindowsXP の ActivePerl で動作させつつタスクマネージャ
> で見ていたところメモリ使用量も若干少なくなっているようです。
これはあまり重要ではないと思います。
sub2 であっても Perl がガベージコレクションを行うので、極端に
メモリ使用量が減るといったことはないはずです。
> 他の環境等で試してみても悪くなることがないようでしたら
> cvs に
> 入れてみようと思います。
ん〜。
このテストスクリプトでは、こういった結果が出ていますが、mknmz では
処理が異なるので、ここまでの性能差がでるのかどうか、やや疑問です。
テストスクリプトでは sub3 の後に sub2 を呼び出しているのが気になり
ます。
ガベージコレクションの影響を考えるなら、テストスクリプトを2つに分け
て、テストするべきでしょう。
次に単語がアルファベット2文字固定というのも気になります。
文字列が長くなれば、
length($keyindex{$word} だとか、@{$keyindexarray{$word}} のところの
(ハッシュ値計算を含めて)処理時間に影響が出てくるのではないかとも
思います。
それと if (length($keyindex{$word}) > 1000){ のところですが、
$keyindex{$word} が、"[$n]" とテキストでデータを格納しているので、
実際のデータよりも平均すると文字列長が長くなっているのではないかと
思います。(実際のデータはpackされたバイナリデータ)
今回のテストでは、文字列が長くなれば長いほど、ガベージコレクションの
回数が減る可能性が高まるわけですので、有利に働いているのではないか
と思われます。
> 他の環境等で試してみても悪くなることがないようでしたら
> cvs に
> 入れてみようと思います。
テストスクリプトを改良して、もう少し実際に使うデータやデータフォー
マットに合わせたものでテストした方が良いのではないでしょうか。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns @ asahi-net.or.jp
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 メーリングリストの案内