原です。

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 よりも速いよう
> です。数値が大きくなると有利みたいです。僕自身による、いくつかの実際的
> な応用例では、やはり原さんのほうが少し速いです。

大きい数に対して遅いのはなぜかなあ。ルーチンをスイッチするからかな。