1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
require 'java'
require 'benchmark'
import java.lang.Math
Benchmark.bm(45) {|bm|
# Math.abs computation cost is negligible for these tests
(ARGV[0] || 5).to_i.times {
bm.report("Control") {
m = Math
value = 1
10_000_000.times { m; value }
}
bm.report("Math.abs with byte-ranged Fixnum") {
m = Math
value = 1
10_000_000.times { m.abs(value) }
}
bm.report("Math.abs with short-ranged Fixnum") {
m = Math
value = 1 << 8
10_000_000.times { m.abs(value) }
}
bm.report("Math.abs with int-ranged Fixnum") {
m = Math
value = 1 << 16
10_000_000.times { m.abs(value) }
}
bm.report("Math.abs with long-ranged Fixnum") {
m = Math
value = 1 << 32
10_000_000.times { m.abs(value) }
}
bm.report("Math.abs with float-ranged Float") {
m = Math
value = 2.0
10_000_000.times { m.abs(value) }
}
bm.report("Math.abs with double-ranged Float") {
m = Math
value = 2.0 ** 128
10_000_000.times { m.abs(value) }
}
bm.report("Contended Math.abs with double-ranged Float") {
m = Math
value = 2.0 ** 128
10.times.map {|i| Thread.new { 1_000_000.times { m.abs(value) } } }.each(&:join)
}
}
}
|