Performance regression in 1.6.x in using procs as Java interface impls (closure 
conversion)
-------------------------------------------------------------------------------------------

                 Key: JRUBY-5963
                 URL: https://jira.codehaus.org/browse/JRUBY-5963
             Project: JRuby
          Issue Type: Bug
          Components: Java Integration
    Affects Versions: JRuby 1.6.3, JRuby 1.6.2, JRuby 1.6.1, JRuby 1.6
         Environment: Windows 7 x64
Sun JDK 6u24

            Reporter: Joseph Wong


There seems to have been a major performance degradation in JRuby 1.6.x 
(compared to 1.5.x) in using procs as Java interface implementations (aka 
closure conversion - 
http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby#Closure_conversion)

This can be reproduced via the following files:
{code:title=CallbackTest.java}
public final class CallbackTest {
    public static interface Callback {
        public String dummy(String arg);
    }

    public static void test(Callback cb) {
        cb.dummy("Hello");
    }
}
{code} 

{code:title=test_callback.rb}
require 'java'
require 'benchmark'
$CLASSPATH << File.dirname(__FILE__)
CallbackTest = JavaUtilities.get_proxy_class('CallbackTest')

Benchmark.bmbm do |b|
  b.report 'callback_test' do
    10000.times do
      CallbackTest.test do |s|
        s
      end
    end
  end
end
{code}

These are the results I get:

{noformat}

jruby-1.6.2-perf-bug-repro>..\jruby-1.6.2\bin\jruby test_callback.rb
Rehearsal -------------------------------------------------
callback_test  13.278000   0.000000  13.278000 ( 13.244000)
--------------------------------------- total: 13.278000sec

                    user     system      total        real
callback_test  19.858000   0.000000  19.858000 ( 19.858000)

jruby-1.6.2-perf-bug-repro>..\jruby-1.5.1\bin\jruby test_callback.rb
Rehearsal -------------------------------------------------
callback_test   1.621000   0.000000   1.621000 (  1.586000)
---------------------------------------- total: 1.621000sec

                    user     system      total        real
callback_test   0.568000   0.000000   0.568000 (  0.568000)

jruby-1.6.2-perf-bug-repro>..\jruby-1.6.2\bin\jruby -J-Djruby.jit.threshold=0 
-J-Djruby.compile.mode=JIT -J-server -J-Xbatch test_callback.rb
Rehearsal -------------------------------------------------
callback_test  15.490000   0.000000  15.490000 ( 15.446000)
--------------------------------------- total: 15.490000sec

                    user     system      total        real
callback_test  19.911000   0.000000  19.911000 ( 19.911000)

jruby-1.6.2-perf-bug-repro>..\jruby-1.5.1\bin\jruby -J-Djruby.jit.threshold=0 
-J-Djruby.compile.mode=JIT -J-server -J-Xbatch test_callback.rb
Rehearsal -------------------------------------------------
callback_test   2.815000   0.000000   2.815000 (  2.772000)
---------------------------------------- total: 2.815000sec

                    user     system      total        real
callback_test   0.439000   0.000000   0.439000 (  0.439000)

{noformat}


Looks like the source of the performance regression is in the commit 5d8bfad5 
on Dec 17, 2010 "using OneShotClassLoader to generate interface wrappers". Was 
the reason for the switch to use non-cacheable proxy classes so that they can 
be garbage-collected?

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to