Skip to content

JRuby Performance results

Jonathan O'Connor edited this page Feb 25, 2015 · 6 revisions

My results on an old Thinkpad 410 running JRuby 1.7.18. Analysis to come.

joconnor@joconnor-ThinkPad-T410:~/NetBeansProjects/github-gems/fast-ruby$ rake run_benchmark $ ruby -v code/general/begin-rescue-vs-respond-to.rb jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64] Calculating ------------------------------------- begin...rescue 701 i/100ms respond_to? 30118 i/100ms ------------------------------------------------- begin...rescue 7602.0 (±14.4%) i/s - 36452 in 5.034000s respond_to? 1116691.1 (±5.4%) i/s - 5571830 in 5.015001s

Comparison:
         respond_to?:  1116691.1 i/s
      begin...rescue:     7602.0 i/s - 146.89x slower

$ ruby -v code/general/define_method-vs-module-eval.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
module_eval with string
                           132 i/100ms
       define_method       205 i/100ms
-------------------------------------------------
module_eval with string
                         1860.7 (±17.6%) i/s -       7788 in   5.019000s
       define_method     2452.9 (±24.0%) i/s -       9430 in   5.070000s

Comparison:
       define_method:     2452.9 i/s
module_eval with string:     1860.7 i/s - 1.32x slower

$ ruby -v code/general/attr-accessor-vs-getter-and-setter.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
   getter_and_setter     28487 i/100ms
       attr_accessor     29179 i/100ms
-------------------------------------------------
   getter_and_setter   717730.5 (±8.4%) i/s -    3617849 in   5.159000s
       attr_accessor   951122.8 (±4.3%) i/s -    4756177 in   5.011000s

Comparison:
       attr_accessor:   951122.8 i/s
   getter_and_setter:   717730.5 i/s - 1.33x slower

$ ruby -v code/general/assignment.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
 Parallel Assignment     29313 i/100ms
Sequential Assignment
                         33587 i/100ms
-------------------------------------------------
 Parallel Assignment   982931.9 (±11.7%) i/s -    4631454 in   5.016000s
Sequential Assignment
                      1145346.2 (±3.2%) i/s -    5709790 in   4.991000s

Comparison:
Sequential Assignment:  1145346.2 i/s
 Parallel Assignment:   982931.9 i/s - 1.17x slower

$ ruby -v code/hash/merge-vs-merge-bang.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
          Hash#merge       178 i/100ms
         Hash#merge!      1460 i/100ms
-------------------------------------------------
          Hash#merge     2160.1 (±5.7%) i/s -      10858 in   5.046000s
         Hash#merge!    18545.9 (±3.0%) i/s -      93440 in   5.043000s

Comparison:
         Hash#merge!:    18545.9 i/s
          Hash#merge:     2160.1 i/s - 8.59x slower

$ ruby -v code/hash/keys-each-vs-each_key.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
      Hash#keys.each     19330 i/100ms
       Hash#each_key     21541 i/100ms
-------------------------------------------------
      Hash#keys.each   467405.1 (±6.1%) i/s -    2338930 in   5.025000s
       Hash#each_key   504252.5 (±3.2%) i/s -    2520297 in   5.004000s

Comparison:
       Hash#each_key:   504252.5 i/s
      Hash#keys.each:   467405.1 i/s - 1.08x slower

$ ruby -v code/hash/fetch-vs-fetch-with-block.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
    Hash#fetch + arg     22940 i/100ms
  Hash#fetch + block     34390 i/100ms
-------------------------------------------------
    Hash#fetch + arg   547418.2 (±6.5%) i/s -    2729860 in   5.010000s
  Hash#fetch + block  1272667.9 (±4.1%) i/s -    6362150 in   5.009000s

Comparison:
  Hash#fetch + block:  1272667.9 i/s
    Hash#fetch + arg:   547418.2 i/s - 2.32x slower

$ ruby -v code/hash/merge-bang-vs-[]=.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
         Hash#merge!      1560 i/100ms
            Hash#[]=      2610 i/100ms
-------------------------------------------------
         Hash#merge!    19429.1 (±6.9%) i/s -      96720 in   5.006000s
            Hash#[]=    29208.1 (±3.6%) i/s -     146160 in   5.011000s

Comparison:
            Hash#[]=:    29208.1 i/s
         Hash#merge!:    19429.1 i/s - 1.50x slower

$ ruby -v code/string/gsub-vs-tr.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
         String#gsub     16487 i/100ms
           String#tr     26737 i/100ms
-------------------------------------------------
         String#gsub   357924.9 (±8.5%) i/s -    1780596 in   5.015000s
           String#tr   702389.7 (±6.9%) i/s -    3502547 in   5.019001s

Comparison:
           String#tr:   702389.7 i/s
         String#gsub:   357924.9 i/s - 1.96x slower

$ ruby -v code/string/casecmp-vs-downcase-==.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
String#downcase + ==     32657 i/100ms
      String#casecmp     37679 i/100ms
-------------------------------------------------
String#downcase + ==  1100758.9 (±5.7%) i/s -    5486376 in   5.002000s
      String#casecmp  1500076.9 (±3.6%) i/s -    7498121 in   5.006000s

Comparison:
      String#casecmp:  1500076.9 i/s
String#downcase + ==:  1100758.9 i/s - 1.36x slower

$ ruby -v code/string/gsub-vs-sub.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
         String#gsub     14555 i/100ms
          String#sub     19108 i/100ms
-------------------------------------------------
         String#gsub   338996.7 (±12.1%) i/s -    1659270 in   5.000000s
          String#sub   477597.0 (±4.2%) i/s -    2388500 in   5.011000s

Comparison:
          String#sub:   477597.0 i/s
         String#gsub:   338996.7 i/s - 1.41x slower

$ ruby -v code/string/concatenation.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
            String#+     38259 i/100ms
       String#concat     35921 i/100ms
       String#append     37821 i/100ms
         "foo" "bar"     47268 i/100ms
-------------------------------------------------
            String#+  1430385.1 (±5.6%) i/s -    7116174 in   4.993000s
       String#concat  1346297.1 (±3.5%) i/s -    6717227 in   4.996000s
       String#append  1312505.8 (±4.5%) i/s -    6543033 in   4.997000s
         "foo" "bar"  2123294.3 (±5.1%) i/s -   10588032 in   5.002000s

Comparison:
         "foo" "bar":  2123294.3 i/s
            String#+:  1430385.1 i/s - 1.48x slower
       String#concat:  1346297.1 i/s - 1.58x slower
       String#append:  1312505.8 i/s - 1.62x slower

$ ruby -v code/string/end-string-checking-match-vs-start_with.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
           String#=~     20095 i/100ms
    String#end_with?     36606 i/100ms
-------------------------------------------------
           String#=~   630058.7 (±7.4%) i/s -    3134820 in   5.007000s
    String#end_with?  1248337.1 (±5.3%) i/s -    6223020 in   5.001000s

Comparison:
    String#end_with?:  1248337.1 i/s
           String#=~:   630058.7 i/s - 1.98x slower

$ ruby -v code/string/start-string-checking-match-vs-start_with.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
           String#=~     25777 i/100ms
  String#start_with?     38710 i/100ms
-------------------------------------------------
           String#=~   722162.8 (±6.7%) i/s -    3583003 in   4.987000s
  String#start_with?  1484014.8 (±2.9%) i/s -    7432320 in   5.013000s

Comparison:
  String#start_with?:  1484014.8 i/s
           String#=~:   722162.8 i/s - 2.05x slower

$ ruby -v code/enumerable/each-vs-for-loop.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
            For loop      6966 i/100ms
               #each      5369 i/100ms
-------------------------------------------------
            For loop    89120.2 (±1.0%) i/s -     445824 in   5.003000s
               #each    69302.0 (±13.7%) i/s -     332878 in   5.029000s

Comparison:
            For loop:    89120.2 i/s
               #each:    69302.0 i/s - 1.29x slower

$ ruby -v code/enumerable/reverse-each-vs-reverse_each.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
  Array#reverse.each      5086 i/100ms
  Array#reverse_each      5465 i/100ms
-------------------------------------------------
  Array#reverse.each    68846.5 (±10.5%) i/s -     335676 in   5.004000s
  Array#reverse_each    73340.8 (±3.6%) i/s -     366155 in   5.000000s

Comparison:
  Array#reverse_each:    73340.8 i/s
  Array#reverse.each:    68846.5 i/s - 1.07x slower

$ ruby -v code/enumerable/each_with_index-vs-while-loop.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
code/enumerable/each_with_index-vs-while-loop.rb:14 warning: Useless use of + in void context.
Calculating -------------------------------------
     each_with_index      3271 i/100ms
          While Loop      3403 i/100ms
-------------------------------------------------
     each_with_index    42730.8 (±7.8%) i/s -     212615 in   5.011000s
          While Loop    37206.3 (±1.0%) i/s -     187165 in   5.031000s

Comparison:
     each_with_index:    42730.8 i/s
          While Loop:    37206.3 i/s - 1.15x slower

$ ruby -v code/enumerable/each-push-vs-map.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
   Array#each + push      2915 i/100ms
           Array#map      5860 i/100ms
-------------------------------------------------
   Array#each + push    38146.8 (±7.6%) i/s -     189475 in   4.999999s
           Array#map    71978.7 (±1.6%) i/s -     363320 in   5.049000s

Comparison:
           Array#map:    71978.7 i/s
   Array#each + push:    38146.8 i/s - 1.89x slower

$ ruby -v code/enumerable/map-flatten-vs-flat_map.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
Array#map.flatten(1)      1273 i/100ms
   Array#map.flatten      1338 i/100ms
      Array#flat_map      3019 i/100ms
-------------------------------------------------
Array#map.flatten(1)    14318.5 (±4.2%) i/s -      72561 in   5.077000s
   Array#map.flatten    14708.3 (±1.8%) i/s -      73590 in   5.005000s
      Array#flat_map    28886.2 (±2.5%) i/s -     144912 in   5.020000s

Comparison:
      Array#flat_map:    28886.2 i/s
   Array#map.flatten:    14708.3 i/s - 1.96x slower
Array#map.flatten(1):    14318.5 i/s - 2.02x slower

$ ruby -v code/enumerable/select-first-vs-detect.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
Enumerable#select.first
                          4491 i/100ms
   Enumerable#detect     17048 i/100ms
-------------------------------------------------
Enumerable#select.first
                        54763.1 (±5.1%) i/s -    1091313 in  19.995999s
   Enumerable#detect   290959.3 (±3.3%) i/s -    5813368 in  20.004000s

Comparison:
   Enumerable#detect:   290959.3 i/s
Enumerable#select.first:    54763.1 i/s - 5.31x slower

$ ruby -v code/enumerable/sort-vs-sort_by.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
     Enumerable#sort       434 i/100ms
  Enumerable#sort_by      1535 i/100ms
-------------------------------------------------
     Enumerable#sort     4820.6 (±6.1%) i/s -      24304 in   5.062000s
  Enumerable#sort_by    16571.7 (±2.7%) i/s -      82890 in   5.006000s

Comparison:
  Enumerable#sort_by:    16571.7 i/s
     Enumerable#sort:     4820.6 i/s - 3.44x slower

$ ruby -v code/array/count-vs-size.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
              #count     38719 i/100ms
               #size     39345 i/100ms
-------------------------------------------------
              #count  1643291.9 (±5.6%) i/s -    8169709 in   4.994000s
               #size  1624987.8 (±5.0%) i/s -    8105070 in   5.003000s

Comparison:
              #count:  1643291.9 i/s
               #size:  1624987.8 i/s - 1.01x slower

$ ruby -v code/array/shuffle-first-vs-sample.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
 Array#shuffle.first      8836 i/100ms
        Array#sample     35388 i/100ms
-------------------------------------------------
 Array#shuffle.first   120878.9 (±3.4%) i/s -     609684 in   5.051000s
        Array#sample  1365647.9 (±7.9%) i/s -    6759108 in   4.992000s

Comparison:
        Array#sample:  1365647.9 i/s
 Array#shuffle.first:   120878.9 i/s - 11.30x slower

$ ruby -v code/array/bsearch-vs-find.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Error: Your application used more memory than the safety cap of 2048M.
Specify -J-Xmx####m to increase it (#### = cap size in MB).
Exception trace follows:
java.lang.OutOfMemoryError: Java heap space
    at org.jruby.RubyFixnum.newFixnum(RubyFixnum.java:186)
    at org.jruby.RubyRange.to_a(RubyRange.java:413)
    at org.jruby.RubyRange$INVOKER$i$0$0$to_a.call(RubyRange$INVOKER$i$0$0$to_a.gen)
    at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrNBlock.call(JavaMethod.java:280)
    at org.jruby.RubyClass.finvoke(RubyClass.java:624)
    at org.jruby.runtime.Helpers.invoke(Helpers.java:500)
    at org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:355)
    at org.jruby.runtime.Helpers.arrayValue(Helpers.java:1808)
    at org.jruby.runtime.Helpers.arrayValue(Helpers.java:1797)
    at org.jruby.runtime.Helpers.splatValue19(Helpers.java:1899)
    at org.jruby.ast.Splat19Node.interpret(Splat19Node.java:48)
    at org.jruby.ast.LocalAsgnNode.interpret(LocalAsgnNode.java:123)
    at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
    at org.jruby.ast.BlockNode.interpret(BlockNode.java:71)
    at org.jruby.ast.RootNode.interpret(RootNode.java:129)
    at org.jruby.evaluator.ASTInterpreter.INTERPRET_ROOT(ASTInterpreter.java:121)
    at org.jruby.Ruby.runInterpreter(Ruby.java:893)
    at org.jruby.Ruby.runInterpreter(Ruby.java:901)
    at org.jruby.Ruby.runNormally(Ruby.java:732)
    at org.jruby.Ruby.runFromMain(Ruby.java:577)
    at org.jruby.Main.doRunFromMain(Main.java:395)
    at org.jruby.Main.internalRun(Main.java:290)
    at org.jruby.Main.run(Main.java:217)
    at org.jruby.Main.main(Main.java:197)
$ ruby -v code/proc-and-block/block-vs-to_proc.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
               Block      1906 i/100ms
      Symbol#to_proc      1826 i/100ms
-------------------------------------------------
               Block    26342.2 (±17.9%) i/s -     116266 in   5.039000s
      Symbol#to_proc    40614.6 (±5.1%) i/s -     202686 in   5.005000s

Comparison:
      Symbol#to_proc:    40614.6 i/s
               Block:    26342.2 i/s - 1.54x slower

$ ruby -v code/proc-and-block/proc-call-vs-yield.rb
jruby 1.7.18 (1.9.3p551) 2014-12-22 625381c on Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13 [linux-amd64]
Calculating -------------------------------------
          block.call     29970 i/100ms
               yield     36018 i/100ms
-------------------------------------------------
          block.call  1051319.0 (±8.3%) i/s -    5094900 in   4.987000s
               yield  1191218.5 (±24.2%) i/s -    4826412 in   5.004000s

Comparison:
               yield:  1191218.5 i/s
          block.call:  1051319.0 i/s - 1.13x slower
Clone this wiki locally