From: Minero Aoki Date: 2000-05-11T19:13:46+09:00 Subject: [ruby-list:22460] Re: IO.foreach あおきです。 In mail "[ruby-list:22459] Re: IO.foreach" matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > > In message "[ruby-list:22458] IO.foreach" > on 00/05/11, Hiroshi SATO writes: > > |一部の処理の速度が遅くて困ってます. > |Perl では数分で完了したものが,何故か数時間かかります. > |その本質的な部分を抜き出すと,以下のようなものです. (略) > また、foreachのループ変数として使われているlineですが、メソッ > ドの先頭に line = nil としておくと少々速くなります。ブロック > 内で初出の変数はちょっと遅くなっちゃうんです。これも将来直し 姑息な手ならあとみっつくらい考えつきました。 def load( list = {} ) key = line = h = nil # ブロック変数は普通のローカル変数にする base = @base # インスタンス変数はローカル変数にキャッシュ re = /\A(\d{7}):(\d{7}):([\d\.]{7})\n/ File.foreach( @path ) do |line| # 何回も使う文字列は一度だけ生成する if re === line and not list[ key = $1 ] then unless h = base[key] then base[key] = h = {} # $1 での検索は一回にする end h[$2] = $3.to_f end end end インスタンス変数 -> ローカル変数のキャッシュが結構効きます。 あと、こんなの絶対だれもやらねーだろうって手ですが、ソースを できるだけ一行につめこむようにすると、ごくわずか速くなります。 (なぜなら行番号をふやすのにノードを一個使ってるから…) ------------------------------------------------------------------- あおきみねろう