原です。 Tadayoshi Funaba さんは書きました: > もうあまり手を入れないでおこうと思ったのです、つい手を入れてしまいまし > た。 > > もう作業を始められたと思いますし、参考にもならないでしょうが、一応あた > らしいのを出しておきます。 ありがとうございます。0.0.4 を元にします。 次のような小さな数に対する積のベンチマークでは、rational-1.19 の方が4倍 ぐらい速いみたい。何が原因かこれから研究します。 -------^ bench.rb require "rational.rb" $libname = ARGV.shift || "(unknown)" def sa(name, from, to, size) fname = sprintf("INT%s_%d_%d_%d", name, from, to, size) unless File.exist?(fname) a = (1..size).map{Rational(rand(to - from + 1) + from)} open(fname, "w") {|f| f << a.join("\n")} end File.read(fname).split.map{|x| x.to_i} end def bm(name, routine = nil, n = 1) start = Time.now n.times do yield end stop = Time.now printf("= %-20s %-20s %f sec.\n", name, "(#{$libname})", stop - start) end def prod1 n = 10**4 a = sa('a', 1, 100, n).zip(sa('b', 1, 100, n)).map{|x, y| Rational(x, y)} bm("product-small", $libname) do s = Rational(1) a.each do |x| s *= x end end end prod1 -------$ bench.rb $ ruby -I../rationa-1.19 bench.rb rational-1.19 >> benchmark.log $ ruby -I../nurat-0.0.4/lib:../nurat-0.0.3/ext bench.rb nurat-0.0.4 >> benchmark.log > 最新のものは、ある種の計算では、原さんの rational 1.19 よりも速いよう > です。数値が大きくなると有利みたいです。僕自身による、いくつかの実際的 > な応用例では、やはり原さんのほうが少し速いです。 大きい数に対して遅いのはなぜかなあ。ルーチンをスイッチするからかな。