From: wakou@... Date: 1999-09-13T07:14:07+09:00 Subject: [ruby-list:16733] Re: Sieve of Eratosthenes (Re: [ruby-dev:6094]) 青山です。 On Sat, 11 Sep 1999 01:56:18 +0900, Shin-ichiro Hara wrote: > 逆に言うと yield() はそれほど重いわけでもないということかな。 > > while の方が条件部を毎回評価するので遅い印象があったんですが、 > 今回の形に関してはそれはあまり関係ありませんでしたね。(^^; 私も step の方が最適化されていそうに思ったのですが、実際はちょっとやや こしいようです。 $ time ruby -e 'j=0; 0.step(1000000,2){|j| j }' real 0m1.810s user 0m1.770s sys 0m0.030s $ time ruby -e 'j=0; while j<=1000000; j+=2; end' real 0m2.479s user 0m2.420s sys 0m0.020s このように、j を扱うだけの場合については、while の方は j+=2 のような処 理も必要になりますし、やはり step の方が高速です。しかし、例外的に、外 部(?)の配列の内容を変更する場合には逆転するようです。 $ time ruby -e 'sieve=[]; j=0; 0.step(500000,2){|j| sieve[j]=nil }' real 0m3.724s user 0m3.530s sys 0m0.180s $ time ruby -e 'sieve=[]; j=0; while j<=500000; sieve[j]=nil; j+=2; end' real 0m2.319s user 0m2.170s sys 0m0.140s スコープの切替えというか、判断が入るようになるからなんでしょうかね。し かし、sieve = "" にして concat や、sieve = {} にして sieve[j]=1 では 逆転はしませんし、ちょっと特殊な例のようです。 -- 青山 和光 Wakou Aoyama