From: Shigeo Kobayashi Date: 2000-01-30T00:20:41+09:00 Subject: [ruby-dev:9042] Ruby's overhead 小林です。 なんとか、BigFloat が少し安定したので 1.0.0 に して RAA に入れました。new その他の仕様を変 更しました(今までダウンロードされた方、影響は ないですよね?)。詳しくは、中に bigfloat.html が ありますので、そちらを参照してください。 で、以下のようにπを 4000 桁まで計算するプロ グラムを Ruby で作ってみました。この時間と、 BigFloat::PI(4000) と比べてみました(pi.rb はまだ 試していません)。ロジックはどちらも全く同じです。 従って、時間差は Ruby のオーバーヘッドになる と思います。 結果は AMD K6(266MHz) で BigFloat::PI(4000) が 4.89 秒、Ruby が 9.48 秒でした。このような 計算は内部計算の比率が高いので、Ruby の オーバーヘッド比率は少ないと思っていた私に は、やや意外でした。反面、内部は整数計算だし、 こんなものかな?という気もします。急造試験な ので、間違いを恐れるものではありますが、皆さ んはどうとらえますか ? なを、このπロジック(プログラム)は松阪大学の 奥村晴彦さんが以下のURLで公開している Java の BigDecimal を使用したものと同じです。 http://www.matsusaka-u.ac.jp/~okumura/java/keisan-big.html BigDecimal と BigFloat の扱いはかなり異なる (と思われる)のに、 BigFloat::PI() はこれとほとん ど同じスピードです。 (^。^) require "BigFloat" # # PI (Calculates 3.1415.... using J. Machin's formula. # # 1. Calculate 'sig' figures using BigFloat::PI(sig). # 2. Calculate the same 'sig' figures using Ruby's iteration # with the same formula. # 3. Compares time consumed. # sig = 4000 # <== Number of significant figures exp = -sig sig = sig + sig/100 # no theoretical reason pi = BigFloat::new("0") two = BigFloat::new("2") m25 = BigFloat::new("-0.04") m57121 = BigFloat::new("-57121") k = BigFloat::new("1") t = BigFloat::new("-80") v = BigFloat::new("0",sig) u = BigFloat::new("0",sig) ts = Time::now vpi = BigFloat::PI(sig) # 1. Step 1 tvp = Time::now - ts # p vpi n1 = 0 n2 = 0 ts = Time::now while (true) # 2. Step 2 n1 += 1 # BigFloat::divmod!(v,t,m25) BigFloat::mult!(v,t,m25) t = v.dup BigFloat::divmod!(u,t,k) break if(u.exponent < exp ) BigFloat::add!(v,pi,u) pi = v.dup k = k + two end k = BigFloat::new("1") t = BigFloat::new("956") while (true) n2 += 1 BigFloat::divmod!(v,t,m57121) t = v.dup BigFloat::divmod!(u,t,k) break if(u.exponent < exp ) BigFloat::add!(v,pi,u) pi = v.dup k = k + two end tr = Time::now - ts # p pi print "# of iterations = ",n1,"+",n2,"\n" print "Ext lib=",tvp,"\n" # Time spent by ext lib. print "Ruby =",tr,"\n" # TIme spent by Ruby + ext. lib. # # tr-tvp should Ruby's overhead(the time spent by Ruby). # p pi - vpi exit 小林 茂雄 E-Mail: shigeo@tinyforest.gr.jp Home Page: http://www.tinyforest.gr.jp