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("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("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 + 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("Fixnum + Bignum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        fixnums[i] + bignums[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

  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("Float + Bignum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        floats[i] + bignums[j]
        i += 1
        j -= 1
      end
      times += 1
    end
  end

  x.report("Float + Fixnum") do
    times = 0
    while times < total
      i, j = 0, total-1
      while i < total
        floats[i] + fixnums[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.526538)
Bignum + Bignum   1.230000   0.010000   1.240000 (  1.241606)
Bignum + Fixnum   1.470000   0.000000   1.470000 (  1.480382)
Bignum + Float    1.000000   0.010000   1.010000 (  1.023455)
Fixnum + Fixnum   0.940000   0.000000   0.940000 (  0.956190)
Fixnum + Bignum   1.960000   0.010000   1.970000 (  1.976145)
Fixnum + Float    0.980000   0.010000   0.990000 (  0.986041)
Float + Float     0.970000   0.000000   0.970000 (  0.983038)
Float + Bignum    1.000000   0.010000   1.010000 (  1.028215)
Float + Fixnum    0.990000   0.000000   0.990000 (  0.992212)
----------------------------------------- total: 11.110000sec

                      user     system      total        real
loop              0.510000   0.010000   0.520000 (  0.513927)
Bignum + Bignum   1.230000   0.000000   1.230000 (  1.229817)
Bignum + Fixnum   1.460000   0.010000   1.470000 (  1.477439)
Bignum + Float    1.000000   0.000000   1.000000 (  1.007784)
Fixnum + Fixnum   0.930000   0.010000   0.940000 (  0.956147)
Fixnum + Bignum   1.950000   0.000000   1.950000 (  1.977649)
Fixnum + Float    0.970000   0.000000   0.970000 (  0.972687)
Float + Float     0.980000   0.010000   0.990000 (  0.989669)
Float + Bignum    1.000000   0.000000   1.000000 (  1.027935)
Float + Fixnum    0.980000   0.000000   0.980000 (  0.980609)

rbx before


			
euler:rubinius brian$ TOTAL=1_000 shotgun/rubinius math.rb 
Rehearsal ---------------------------------------------------
loop              0.082213   0.000000   0.082213 (  0.082195)
Bignum + Bignum   0.786170   0.000000   0.786170 (  0.786153)
Bignum + Fixnum   3.507383   0.000000   3.507383 (  3.507342)
Bignum + Float    6.047656   0.000000   6.047656 (  6.047641)
Fixnum + Fixnum   0.230899   0.000000   0.230899 (  0.230879)
Fixnum + Bignum   3.563296   0.000000   3.563296 (  3.563289)
Fixnum + Float    5.941993   0.000000   5.941993 (  5.941975)
Float + Float     0.789120   0.000000   0.789120 (  0.789106)
Float + Bignum    6.132281   0.000000   6.132281 (  6.132263)
Float + Fixnum    6.172868   0.000000   6.172868 (  6.172852)
----------------------------------------- total: 33.253879sec

                      user     system      total        real
loop              0.087209   0.000000   0.087209 (  0.087188)
Bignum + Bignum   0.753885   0.000000   0.753885 (  0.753881)
Bignum + Fixnum   3.501982   0.000000   3.501982 (  3.501985)
Bignum + Float    6.108905   0.000000   6.108905 (  6.108903)
Fixnum + Fixnum   0.210097   0.000000   0.210097 (  0.210081)
Fixnum + Bignum   3.508541   0.000000   3.508541 (  3.508554)
Fixnum + Float    5.920287   0.000000   5.920287 (  5.920289)
Float + Float     0.835571   0.000000   0.835571 (  0.835566)
Float + Bignum    6.205112   0.000000   6.205112 (  6.205113)
Float + Fixnum    6.216693   0.000000   6.216693 (  6.216691)

rbx after rework of Float only


			
euler:rubinius brian$ TOTAL=1_000 shotgun/rubinius math.rb 
Rehearsal ---------------------------------------------------
loop              0.084886   0.000000   0.084886 (  0.084848)
Bignum + Bignum   0.755755   0.000000   0.755755 (  0.755733)
Bignum + Fixnum   3.316833   0.000000   3.316833 (  3.316814)
Bignum + Float    4.260303   0.000000   4.260303 (  4.260280)
Fixnum + Fixnum   0.214757   0.000000   0.214757 (  0.214762)
Fixnum + Bignum   3.433364   0.000000   3.433364 (  3.433348)
Fixnum + Float    4.199053   0.000000   4.199053 (  4.199036)
Float + Float     0.310652   0.000000   0.310652 (  0.310634)
Float + Bignum    0.409653   0.000000   0.409653 (  0.409644)
Float + Fixnum    0.385315   0.000000   0.385315 (  0.385296)
----------------------------------------- total: 17.370571sec

                      user     system      total        real
loop              0.082152   0.000000   0.082152 (  0.082125)
Bignum + Bignum   0.719112   0.000000   0.719112 (  0.719104)
Bignum + Fixnum   3.280030   0.000000   3.280030 (  3.280026)
Bignum + Float    4.317936   0.000000   4.317936 (  4.317934)
Fixnum + Fixnum   0.211694   0.000000   0.211694 (  0.211678)
Fixnum + Bignum   3.371581   0.000000   3.371581 (  3.371591)
Fixnum + Float    4.097401   0.000000   4.097401 (  4.097396)
Float + Float     0.315193   0.000000   0.315193 (  0.315200)
Float + Bignum    0.418549   0.000000   0.418549 (  0.418555)
Float + Fixnum    0.380301   0.000000   0.380301 (  0.380296)

after more rework of Bignum, Fixnum


			
70-6-253-92:rubinius brian$ TOTAL=1_000 shotgun/rubinius math.rb 
Rehearsal ---------------------------------------------------
loop              0.083874   0.000000   0.083874 (  0.083841)
Bignum + Bignum   0.773796   0.000000   0.773796 (  0.773774)
Bignum + Fixnum   1.395339   0.000000   1.395339 (  1.395324)
Bignum + Float    0.353866   0.000000   0.353866 (  0.353851)
Fixnum + Fixnum   0.232125   0.000000   0.232125 (  0.232106)
Fixnum + Bignum   1.416564   0.000000   1.416564 (  1.416522)
Fixnum + Float    0.378118   0.000000   0.378118 (  0.378100)
Float + Float     0.304509   0.000000   0.304509 (  0.304491)
Float + Bignum    0.399603   0.000000   0.399603 (  0.399588)
Float + Fixnum    0.364755   0.000000   0.364755 (  0.364735)
------------------------------------------ total: 5.702549sec

                      user     system      total        real
loop              0.082133   0.000000   0.082133 (  0.082132)
Bignum + Bignum   0.727976   0.000000   0.727976 (  0.727964)
Bignum + Fixnum   1.380439   0.000000   1.380439 (  1.380427)
Bignum + Float    0.339638   0.000000   0.339638 (  0.339641)
Fixnum + Fixnum   0.217382   0.000000   0.217382 (  0.217379)
Fixnum + Bignum   1.412270   0.000000   1.412270 (  1.412246)
Fixnum + Float    0.367439   0.000000   0.367439 (  0.367441)
Float + Float     0.307626   0.000000   0.307626 (  0.307638)
Float + Bignum    0.398086   0.000000   0.398086 (  0.398091)
Float + Fixnum    0.367171   0.000000   0.367171 (  0.367164)