Performance difference between MRI Ruby and jRuby -
while doing benchmarking answer this question fastest way concatenate arrays surprised when did same benchmarks in jruby tests lot slower.
does mean old adagio jruby being faster mri ruby gone ? or how arrays treated in jruby ?
here benchmark , results in both mri ruby 2.3.0 , jruby 9.1.2.0 both run on 64bit windows 7 box, 4 processors busy 50-60%, memory in use ± 5.5gb. jruby had started parameter -j-xmx1500m
provide enough heap space. had remove test push because of stack level deep , removed slowest methods not make tests long. used jave runtime: 1.7.0_21
require 'benchmark' n = 100 class array def concat_all self.reduce([], :+) end end # small arrays = (1..10).to_a b = (11..20).to_a c = (21..30).to_a benchmark.bm |r| r.report('plus ') { n.times { + b + c }} r.report('concat ') { n.times { [].concat(a).concat(b).concat(c) }} r.report('splash ') { n.times {[*a, *b, *c]} } r.report('concat_all ') { n.times { [a, b, c].concat_all }} r.report('flat_map ') { n.times {[a, b, c].flat_map(&:itself)} } end #large arrays = (1..10_000_000).to_a b = (10_000_001..20_000_000).to_a c = (20_000_001..30_000_000).to_a benchmark.bm |r| r.report('plus ') { n.times { + b + c }} r.report('concat ') { n.times { [].concat(a).concat(b).concat(c) }} r.report('splash ') { n.times {[*a, *b, *c]} } r.report('concat_all ') { n.times { [a, b, c].concat_all }} r.report('flat_map ') { n.times {[a, b, c].flat_map(&:itself)} } end
this question not different methods used, see original question that. in both situations mri 7 times faster ! can exlain me why ? i'm curious how other implementations do, rbx (rubinius)
c:\users\...>d:\jruby\bin\jruby -j-xmx1500m concat3.rb user system total real plus 0.000000 0.000000 0.000000 ( 0.000946) concat 0.000000 0.000000 0.000000 ( 0.001436) splash 0.000000 0.000000 0.000000 ( 0.001456) concat_all 0.000000 0.000000 0.000000 ( 0.002177) flat_map 0.010000 0.000000 0.010000 ( 0.003179) user system total real plus 140.166000 0.000000 140.166000 (140.158687) concat 143.475000 0.000000 143.475000 (143.473786) splash 139.408000 0.000000 139.408000 (139.406671) concat_all 144.475000 0.000000 144.475000 (144.474436) flat_map143.519000 0.000000 143.519000 (143.517636) c:\users\...>ruby concat3.rb user system total real plus 0.000000 0.000000 0.000000 ( 0.000074) concat 0.000000 0.000000 0.000000 ( 0.000065) splash 0.000000 0.000000 0.000000 ( 0.000098) concat_all 0.000000 0.000000 0.000000 ( 0.000141) flat_map 0.000000 0.000000 0.000000 ( 0.000122) user system total real plus 15.226000 6.723000 21.949000 ( 21.958854) concat 11.700000 9.142000 20.842000 ( 20.928087) splash 21.247000 12.589000 33.836000 ( 33.933170) concat_all 14.508000 8.315000 22.823000 ( 22.871641) flat_map 11.170000 8.923000 20.093000 ( 20.170945)
general rule (as mentioned in comments) jruby/jvm needs warmup.
usually bmbm
fit, although times=1000
should increased (at least small array cases), 1.5g might not enough optimal performance of jruby (noticed considerable change in numbers going -xmx2g -xmx3g). here's results :
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] $ ruby concat3.rb rehearsal ----------------------------------------------- plus 0.000000 0.000000 0.000000 ( 0.000076) concat 0.000000 0.000000 0.000000 ( 0.000070) splash 0.000000 0.000000 0.000000 ( 0.000099) concat_all 0.000000 0.000000 0.000000 ( 0.000136) flat_map 0.000000 0.000000 0.000000 ( 0.000138) -------------------------------------- total: 0.000000sec user system total real plus 0.000000 0.000000 0.000000 ( 0.000051) concat 0.000000 0.000000 0.000000 ( 0.000059) splash 0.000000 0.000000 0.000000 ( 0.000083) concat_all 0.000000 0.000000 0.000000 ( 0.000120) flat_map 0.000000 0.000000 0.000000 ( 0.000173) rehearsal ----------------------------------------------- plus 43.040000 3.320000 46.360000 ( 46.351004) concat 15.080000 3.870000 18.950000 ( 19.228059) splash 49.680000 4.820000 54.500000 ( 54.587707) concat_all 51.840000 5.260000 57.100000 ( 57.114867) flat_map 17.380000 5.340000 22.720000 ( 22.716987) ------------------------------------ total: 199.630000sec user system total real plus 42.880000 3.600000 46.480000 ( 46.506013) concat 17.230000 5.290000 22.520000 ( 22.890809) splash 60.300000 7.480000 67.780000 ( 67.878534) concat_all 54.910000 6.480000 61.390000 ( 61.404383) flat_map 17.310000 5.570000 22.880000 ( 23.223789)
...
jruby 9.1.6.0 (2.3.1) 2016-11-09 0150a76 java hotspot(tm) 64-bit server vm 25.112-b15 on 1.8.0_112-b15 +jit [linux-x86_64] $ jruby -j-xmx3g concat3.rb rehearsal ----------------------------------------------- plus 0.010000 0.000000 0.010000 ( 0.001445) concat 0.000000 0.000000 0.000000 ( 0.002534) splash 0.000000 0.000000 0.000000 ( 0.001791) concat_all 0.000000 0.000000 0.000000 ( 0.002513) flat_map 0.010000 0.000000 0.010000 ( 0.007088) -------------------------------------- total: 0.020000sec user system total real plus 0.010000 0.000000 0.010000 ( 0.002700) concat 0.000000 0.000000 0.000000 ( 0.001085) splash 0.000000 0.000000 0.000000 ( 0.001569) concat_all 0.000000 0.000000 0.000000 ( 0.003052) flat_map 0.000000 0.000000 0.000000 ( 0.002252) rehearsal ----------------------------------------------- plus 32.410000 0.670000 33.080000 ( 17.385688) concat 18.610000 0.060000 18.670000 ( 11.206419) splash 57.770000 0.330000 58.100000 ( 25.366032) concat_all 19.100000 0.030000 19.130000 ( 13.747319) flat_map 16.160000 0.040000 16.200000 ( 10.534130) ------------------------------------ total: 145.180000sec user system total real plus 16.060000 0.040000 16.100000 ( 11.737483) concat 15.950000 0.030000 15.980000 ( 10.480468) splash 47.870000 0.130000 48.000000 ( 22.668069) concat_all 19.150000 0.030000 19.180000 ( 13.934314) flat_map 16.850000 0.020000 16.870000 ( 10.862716)
... seems opposite - mri 2.3 gets 2-5x slower jruby 9.1
cat concat3.rb require 'benchmark' n = (env['times'] || 100).to_i class array def concat_all self.reduce([], :+) end end # small arrays = (1..10).to_a b = (11..20).to_a c = (21..30).to_a benchmark.bmbm |r| r.report('plus ') { n.times { + b + c }} r.report('concat ') { n.times { [].concat(a).concat(b).concat(c) }} r.report('splash ') { n.times {[*a, *b, *c]} } r.report('concat_all ') { n.times { [a, b, c].concat_all }} r.report('flat_map ') { n.times {[a, b, c].flat_map(&:itself)} } end #large arrays = (1..10_000_000).to_a b = (10_000_001..20_000_000).to_a c = (20_000_001..30_000_000).to_a benchmark.bmbm |r| r.report('plus ') { n.times { + b + c }} r.report('concat ') { n.times { [].concat(a).concat(b).concat(c) }} r.report('splash ') { n.times {[*a, *b, *c]} } r.report('concat_all ') { n.times { [a, b, c].concat_all }} r.report('flat_map ') { n.times {[a, b, c].flat_map(&:itself)} } end
Comments
Post a Comment