[mew-dist 29125] Re: cmewが例外で終わる

Kazu Yamamoto ( 山本和彦 ) kazu at example.com
2010年 2月 19日 (金) 22:20:22 JST


> dryrunなしに、さっそく試してみましたところ
> 予想に反してRuby版cmewの方が速いです。
> 
>     haskel版 46s
>     ruby版   21s
> 
> ユーザ時間もシステム時間もruby版の倍ちかくあるので、
> なにか無駄なことをやっているのかruby版が手抜きなのか...
> ZFSとの相性がわるいのか..

それは、ディレクトリのリンクカウントを参照していないからでしょう。UNIX
では、子のディレクトリがないことを、ディレクトリのリンクカウントを参照す
るだけで分かります。

Ruby 版ではディレクトリのリンクカウントを参照します。ただ、これが
Windows でちゃんと動いているのかは知りません。Haskell ではディレクトリ
のリンクカウントを調べる汎用的な方法はありません。やるとしたら、CPP を
使って、プラットフォームごとに #ifdef で区切る必要があります。

驚くべきことに、Mac のディレクトリのリンクカウントは、格納しているファ
イル数なので、上記を実装する気力が失せてしまいました。(-- xxx check
link count の部分です。)

というわけで、Mac で比べると Haskell の方が速いです。Windows でも、きっ
とそうでしょう。また、-f で実行すると UNIX でも速いと思います。

> haskellは勝手にマルチスレッドになるというわけではない?

ディスクを触るプログラムをマルチスレッドにしても、あまり効果はないでしょ
う。ロックも発生するから、逆に遅くなるかも。。。

> たしかruby版は以下のように
> 祖先はたどるが祖先の子孫は表示しないという仕様だったかと。

そうだったかも知れません。。。

--かず


Mew-dist メーリングリストの案内