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

Popular posts from this blog

asynchronous - C# WinSCP .NET assembly: How to upload multiple files asynchronously -

aws api gateway - SerializationException in posting new Records via Dynamodb Proxy Service in API -

asp.net - Problems sending emails from forum -