From: matz@... (Yukihiro Matsumoto) Date: 2000-05-11T17:17:05+09:00 Subject: [ruby-list:22459] Re: IO.foreach まつもと ゆきひろです In message "[ruby-list:22458] IO.foreach" on 00/05/11, Hiroshi SATO writes: |一部の処理の速度が遅くて困ってます. |Perl では数分で完了したものが,何故か数時間かかります. |その本質的な部分を抜き出すと,以下のようなものです. まあ、こまごまとしたコストが積み重なってこういうのはRubyにとっ て苦手な部類の処理に入るのですが、それでも手元ではあまり大き くないデータでは最大3倍程度の差でした。数分が数時間と言うの は差が大きすぎますね。 しかし、 |なお,そのファイルは200万行以上あります.:) ということですから、あるいはメモリの関係かもしれません。私の 貧弱なマシンでは20万行程度でPerlでもOut of Memoryでしたから。 つまり、 仮説1 Ruby版の方がメモリ消費量が多く、メモリを圧迫して一種のス ラッシングを起こしている。 仮説2 途中でGCが頻繁に起動されていてそれが遅くなる原因 のいずれかあるいは両方ではないかと思います。メモリに余裕があ るのであれば重い処理の前にGC.disableを呼んでおくというのはあ りえる手段ではあります。将来、GCがgeneration scavengingとか になれば少しは改善されるかも。 また、foreachのループ変数として使われているlineですが、メソッ ドの先頭に line = nil としておくと少々速くなります。ブロック 内で初出の変数はちょっと遅くなっちゃうんです。これも将来直し たいと思ってます。 まつもと ゆきひろ /:|)