Permalink
Browse files

Speed-up of Array#== in some use cases.

This is actually how MRI does things too.
Improves equal_bench from 16.5sec to 15.7sec.
  • Loading branch information...
1 parent 84271d0 commit 99275261da64c8820dd7ffa64d2eff2a1109aaca @vvs vvs committed Jan 20, 2010
Showing with 50 additions and 0 deletions.
  1. +47 −0 bench/core/array/equal_bench.rb
  2. +3 −0 src/org/jruby/RubyArray.java
@@ -0,0 +1,47 @@
+require 'benchmark'
+
+def bench_array(bm)
+ arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
+ bm.report("10m array == array, 20 Fixnum array") do
+ i = 0
+ while i < 10_000_000
+ arr == arr
+ i+=1
+ end
+ end
+
+ bm.report("2m array == array.dup, 20 Fixnum array") do
+ i = 0
+ while i < 2_000_000
+ arr == arr.dup
+ i+=1
+ end
+ end
+
+ arr3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
+ bm.report("10m array == array, 200 Fixnum array") do
+ i = 0
+ while i < 10_000_000
+ arr3 == arr3
+ i+=1
+ end
+ end
+
+ bm.report("2m array == array.dup, 200 Fixnum array") do
+ i = 0
+ while i < 2_000_000
+ arr3 == arr3.dup
+ i+=1
+ end
+ end
+end
+
+if $0 == __FILE__
+ if ARGV[0]
+ ARGV[0].to_i.times {
+ Benchmark.bm(40) {|bm| bench_array(bm)}
+ }
+ else
+ Benchmark.bmbm {|bm| bench_array(bm)}
+ end
+end
@@ -1968,6 +1968,9 @@ public IRubyObject checkArrayType(){
@JRubyMethod(name = "==", required = 1)
@Override
public IRubyObject op_equal(ThreadContext context, IRubyObject obj) {
+ if (this == obj) {
+ return context.getRuntime().getTrue();
+ }
if (!(obj instanceof RubyArray)) {
if (!obj.respondsTo("to_ary")) {
return context.getRuntime().getFalse();

0 comments on commit 9927526

Please sign in to comment.