| require 'timeout' |
| require 'bigdecimal' |
| |
| $VERBOSE = nil |
| M = 5 |
| TIMEOUT = 1.0 |
| |
| def measure(proc) |
| (1..M).map do |
| n = 0 |
| Timeout.timeout(TIMEOUT) do |
| loop do |
| proc.() |
| n += 1 |
| end |
| end rescue nil |
| n |
| end.max |
| end |
| |
| r = Rational(1, 3) |
| b1, b2 = (1 << 64) + 1, (1 << 64) + 3 |
| r2 = Rational(b1) |
| r3 = -r |
| f, f2 = 10.0, -3.14 |
| i = 10 |
| bd = BigDecimal('0.1') |
| [ |
| ['Integer#gcd', ->{b1.gcd(b2)}], |
| ['+', ->{r + r}], |
| ['+ huge rational', ->{r + r2}], |
| ['+ float', ->{r + f}], |
| ['+ fixnum', ->{r + i}], |
| ['+ bignum', ->{r + b1}], |
| ['-', ->{r - r}], |
| ['- huge rational', ->{r - r2}], |
| ['- float', ->{r - f}], |
| ['- fixnum', ->{r - i}], |
| ['- bignum', ->{r - b1}], |
| ['*', ->{r * r}], |
| ['* huge rational', ->{r * r2}], |
| ['* float', ->{r * f}], |
| ['* fixnum', ->{r * i}], |
| ['* bignum', ->{r * b1}], |
| ['/', ->{r / r}], |
| ['/ float', ->{r / f}], |
| ['/ huge rational', ->{r / r2}], |
| ['/ fixnum', ->{r / i}], |
| ['/ bignum', ->{r / b1}], |
| ['fdiv(0)', ->{r.fdiv(0)}], |
| ['fdiv(1)', ->{r.fdiv(1)}], |
| ['fdiv(2)', ->{r.fdiv(2)}], |
| ['** fixnum', ->{r ** i}], |
| ['** bignum', ->{r ** b1}], |
| ['** float', ->{r ** f}], |
| ['<=>', ->{r <=> r}], |
| ['<=> float', ->{r <=> f}], |
| ['<=> fixnum', ->{r <=> i}], |
| ['ctor with bignum', ->{Rational(1, b1)}], |
| ['ctor', ->{Rational(1, 3)}], |
| ['==', ->{r == r2}], |
| ['== bignum', ->{r2 == b1}], |
| ['coerce(float)', ->{r.coerce(f)}], |
| ['floor', ->{r.floor}], |
| ['ceil', ->{r.ceil}], |
| ['round', ->{r.round}], |
| ['to_i', ->{r.to_i}], |
| ['to_f', ->{r.to_f}], |
| ['floor(n)', ->{r.floor(1)}], |
| ['ceil(n)', ->{r.ceil(1)}], |
| ['round(n)', ->{r.round(1)}], |
| ['truncate(n)', ->{r.truncate(1)}], |
| ['Numeric#numerator', ->{bd.numerator}], |
| ['Numeric#denominator', ->{bd.denominator}], |
| ['Numeric#quo(integer)', ->{2.quo(3)}], |
| ['Float#numerator', ->{f.numerator}], |
| ['Float#denominator', ->{f.denominator}], |
| ['Float#to_r', ->{f.to_r}], |
| ['Float#to_r (0.1)', ->{0.1.to_r}], |
| ['1.0.rationalize', ->{1.0.rationalize}], |
| ['-1.0.rationalize', ->{-1.0.rationalize}], |
| ['10.0.rationalize(0.0)', ->{f.rationalize(0.0)}], |
| ['0.0.rationalize', ->{0.0.rationalize}], |
| ['10.0.rationalize', ->{f.rationalize}], |
| ['-3.14.rationalize', ->{f2.rationalize}], |
| ['Rational(\'1\')', ->{Rational('1')}], |
| ['Rational(\'3.141592\')', ->{Rational('3.141592')}], |
| ['Rational(\'-1e-10\')', ->{Rational('-1e-10')}], |
| ['negative?', ->{r.negative?}], |
| ['-rational.rationalize(some)', ->{r3.rationalize(r)}], |
| ['Integer#lcm', ->{3.lcm(7)}], |
| ['-@', ->{-r}], |
| ].each do |label, proc| |
| puts label + "\t%d" % measure(proc) |
| STDOUT.flush |
| end |