Report abuse

benchmark


			
require 'benchmark'

total = (ENV['TOTAL'] || 1_000).to_i

fixnums = Array.new(total).fill { |a| rand(100_000).to_i }
bignums = Array.new(total).fill { |a| 0xffff_ffff_ffff_ffff + rand(100_000).to_i }
floats = Array.new(total).fill { |a| rand(100_000).to_f }

Benchmark.bmbm do |x|
  x.report("loop") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Fixnum + Fixnum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        fixnums[i] + fixnums[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Bignum + Bignum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        bignums[i] + bignums[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Float + Float") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        floats[i] + floats[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Bignum + Fixnum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        bignums[i] + fixnums[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Bignum + Float") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        bignums[i] + floats[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Fixnum + Float") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        fixnums[i] + floats[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end
end

MRI


			
euler:rubinius brian$ TOTAL=1_000 ruby math.rb 
Rehearsal ---------------------------------------------------
loop              0.520000   0.000000   0.520000 (  0.532934)
Fixnum + Fixnum   0.940000   0.000000   0.940000 (  0.953535)
Bignum + Bignum   1.230000   0.000000   1.230000 (  1.228264)
Float + Float     0.980000   0.000000   0.980000 (  0.990313)
Bignum + Fixnum   1.440000   0.000000   1.440000 (  1.457598)
Bignum + Float    1.010000   0.010000   1.020000 (  1.020064)
Fixnum + Float    0.970000   0.000000   0.970000 (  0.975901)
------------------------------------------ total: 7.100000sec

                      user     system      total        real
loop              0.510000   0.000000   0.510000 (  0.525869)
Fixnum + Fixnum   0.940000   0.000000   0.940000 (  0.940014)
Bignum + Bignum   1.210000   0.000000   1.210000 (  1.212178)
Float + Float     0.960000   0.000000   0.960000 (  0.956788)
Bignum + Fixnum   1.440000   0.000000   1.440000 (  1.442112)
Bignum + Float    0.990000   0.000000   0.990000 (  0.998438)
Fixnum + Float    0.960000   0.000000   0.960000 (  0.992699)

rbx before


			
euler:rubinius brian$ TOTAL=1_000 shotgun/rubinius math.rb 
Rehearsal ---------------------------------------------------
loop              0.088945   0.000000   0.088945 (  0.088930)
Fixnum + Fixnum   0.231998   0.000000   0.231998 (  0.231984)
Bignum + Bignum   0.821572   0.000000   0.821572 (  0.821547)
Float + Float     1.186975   0.000000   1.186975 (  1.186957)
Bignum + Fixnum   3.689706   0.000000   3.689706 (  3.689688)
Bignum + Float    7.798996   0.000000   7.798996 (  7.798980)
Fixnum + Float    7.743594   0.000000   7.743594 (  7.743577)
----------------------------------------- total: 21.561786sec

                      user     system      total        real
loop              0.087257   0.000000   0.087257 (  0.087245)
Fixnum + Fixnum   0.216869   0.000000   0.216869 (  0.216873)
Bignum + Bignum   0.794047   0.000000   0.794047 (  0.794044)
Float + Float     1.174626   0.000000   1.174626 (  1.174653)
Bignum + Fixnum   3.694634   0.000000   3.694634 (  3.694637)
Bignum + Float    7.764805   0.000000   7.764805 (  7.764801)
Fixnum + Float    7.706353   0.000000   7.706353 (  7.706359)

rbx after rework Float


			
euler:rubinius brian$ TOTAL=1_000 shotgun/rubinius math.rb   
Rehearsal ---------------------------------------------------
loop              0.091259   0.000000   0.091259 (  0.091244)
Bignum + Bignum   0.814227   0.000000   0.814227 (  0.814209)
Bignum + Fixnum   3.882543   0.000000   3.882543 (  3.882530)
Bignum + Float    7.386961   0.000000   7.386961 (  7.386945)
Fixnum + Fixnum   0.247075   0.000000   0.247075 (  0.247040)
Fixnum + Bignum   3.898931   0.000000   3.898931 (  3.898914)
Fixnum + Float    7.294152   0.000000   7.294152 (  7.294133)
Float + Float     1.288831   0.000000   1.288831 (  1.288812)
Float + Bignum    8.912548   0.000000   8.912548 (  8.912531)
Float + Fixnum    8.871426   0.000000   8.871426 (  8.871408)
----------------------------------------- total: 42.687953sec

                      user     system      total        real
loop              0.088884   0.000000   0.088884 (  0.088871)
Bignum + Bignum   0.788301   0.000000   0.788301 (  0.788302)
Bignum + Fixnum   3.930608   0.000000   3.930608 (  3.930595)
Bignum + Float    7.511396   0.000000   7.511396 (  7.511508)
Fixnum + Fixnum   0.258501   0.000000   0.258501 (  0.258489)
Fixnum + Bignum   3.875360   0.000000   3.875360 (  3.875369)
Fixnum + Float    7.303709   0.000000   7.303709 (  7.303705)
Float + Float     1.294617   0.000000   1.294617 (  1.294609)
Float + Bignum    8.901592   0.000000   8.901592 (  8.901595)
Float + Fixnum    8.865972   0.000000   8.865972 (  8.865971)