Tony A. wrote:
Ruby 1.9 isn’t going to help you when using threads to distribute
computation across CPU cores. The Global VM Lock ensures that
simultaneous computation is still limited to one core.
JRuby, on the other hand, does not have this limitation. On MRI/1.9
I would recommend using multiple processes.
I’m not so sure jruby does this effectively.
require ‘tiamat/autoconfig’
require ‘pure/dsl’
require ‘benchmark’
mod = pure do
def total(left, right)
left + right
end
def left
(1…5_000_000).inject(0) { |acc, n| acc + n }
end
def right
(1…5_000_000).inject(0) { |acc, n| acc + n }
end
end
Benchmark.bmbm { |bm|
bm.report(“1 thread, 1 interpreter”) {
mod.compute(1).total
}
bm.report(“2 threads, 1 interpreter”) {
mod.compute(2).total
}
this part removed for jruby bench
bm.report(“2 threads, 2 interpreters”) {
Tiamat.open_local(2) {
mod.compute.total
}
}
}
== ruby 1.9.2dev (2009-10-18 trunk 25393) [i386-darwin9.8.0]
Rehearsal -------------------------------------------------------------
1 thread, 1 interpreter 4.370000 0.020000 4.390000 ( 4.389990)
2 threads, 1 interpreter 4.360000 0.030000 4.390000 ( 4.385111)
2 threads, 2 interpreters 0.010000 0.010000 4.700000 ( 2.460661)
--------------------------------------------------- total: 13.480000sec
user system total real
1 thread, 1 interpreter 4.360000 0.020000 4.380000 ( 4.376050)
2 threads, 1 interpreter 4.360000 0.030000 4.390000 ( 4.380982)
2 threads, 2 interpreters 0.010000 0.010000 4.710000 ( 2.465925)
== jruby 1.4.0RC3 (ruby 1.8.7 patchlevel 174) (2009-10-30 1d7de2d) (Java
HotSpot™ Client VM 1.5.0_20) [i386-java]
Rehearsal ------------------------------------------------------------
1 thread, 1 interpreter 6.060000 0.000000 6.060000 ( 6.060000)
2 threads, 1 interpreter 7.629000 0.000000 7.629000 ( 7.629000)
-------------------------------------------------- total: 13.689000sec
user system total real
1 thread, 1 interpreter 6.080000 0.000000 6.080000 ( 6.080000)
2 threads, 1 interpreter 7.288000 0.000000 7.288000 ( 7.288000)