Skip to content

Instantly share code, notes, and snippets.

@nahi
Created May 17, 2011 09:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nahi/976190 to your computer and use it in GitHub Desktop.
Save nahi/976190 to your computer and use it in GitHub Desktop.
Benchmark of JRuby's require_protection branch + LOADED_FEATURES Hash patch

Summary

Running JRuby on Java HotSpot(TM) 64-Bit Server VM 1.6.0_25) [linux-amd64-java] Average of elapsed time for require * 10000 (Ave. of last 10 of 20 numbers)

require_protection with LOADED_FEATURES Hash patch + containsString patch(attached)
  require 'time' * 10000:          0.019 [sec]
  require 'active_record' * 10000: 0.031 [sec]

require_protection with LOADED_FEATURES Hash patch [require_protection ae71148cfc371ac8313f0e1735b4b5b8130a4cc8]
  require 'time' * 10000:          0.031 [sec]
  require 'active_record' * 10000: 0.037 [sec]

require_protection without LOADED_FEATURES Hash patch [require_protection e4f670ee48ddf23fb15dda5d37bccf9c0bc1534b]
  require 'time' * 10000:          0.026 [sec]
  require 'active_record' * 10000: 0.048 [sec]

jruby-1_6 [jruby-1_6 1bfff67b46acfad3b0a680e1b3f16787f37e968c]
  require 'time' * 10000:          0.145 [sec]
  require 'active_record' * 10000: 0.144 [sec]

master with LOADED_FEATURES Hash patch [master 21565774f8800b3df6f839505365d340b573f253]
  require 'time' * 10000:          0.139 [sec]
  require 'active_record' * 10000: 0.159 [sec]

master without LOADED_FEATURES Hash patch [master c70879d1b40669320cce7033381c0a94f25805b8]
  require 'time' * 10000:          0.126 [sec]
  require 'active_record' * 10000: 0.161 [sec]

Details

require_protection with LOADED_FEATURES Hash patch

% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.063000   0.000000   1.063000 (  0.997000)
require 'time'                  0.107000   0.000000   0.107000 (  0.106000)
require 'time'                  0.040000   0.000000   0.040000 (  0.040000)
require 'time'                  0.052000   0.000000   0.052000 (  0.052000)
require 'time'                  0.028000   0.000000   0.028000 (  0.028000)
require 'time'                  0.025000   0.000000   0.025000 (  0.025000)
require 'time'                  0.020000   0.000000   0.020000 (  0.020000)
require 'time'                  0.026000   0.000000   0.026000 (  0.026000)
require 'time'                  0.039000   0.000000   0.039000 (  0.039000)
require 'time'                  0.029000   0.000000   0.029000 (  0.030000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.151000   0.000000   0.151000 (  0.151000)
require 'time'                  0.072000   0.000000   0.072000 (  0.072000)
require 'time'                  0.071000   0.000000   0.071000 (  0.071000)
require 'time'                  0.075000   0.000000   0.075000 (  0.075000)
require 'time'                  0.063000   0.000000   0.063000 (  0.063000)
require 'time'                  0.051000   0.000000   0.051000 (  0.051000)
require 'time'                  0.073000   0.000000   0.073000 (  0.073000)
require 'time'                  0.024000   0.000000   0.024000 (  0.025000)
require 'time'                  0.027000   0.000000   0.027000 (  0.026000)
require 'time'                  0.027000   0.000000   0.027000 (  0.027000)
% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.054000   0.000000   1.054000 (  0.987000)
require 'time'                  0.107000   0.000000   0.107000 (  0.108000)
require 'time'                  0.056000   0.000000   0.056000 (  0.056000)
require 'time'                  0.053000   0.000000   0.053000 (  0.053000)
require 'time'                  0.028000   0.000000   0.028000 (  0.027000)
require 'time'                  0.046000   0.000000   0.046000 (  0.047000)
require 'time'                  0.022000   0.000000   0.022000 (  0.023000)
require 'time'                  0.029000   0.000000   0.029000 (  0.029000)
require 'time'                  0.039000   0.000000   0.039000 (  0.039000)
require 'time'                  0.030000   0.000000   0.030000 (  0.030000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.144000   0.000000   0.144000 (  0.144000)
require 'time'                  0.076000   0.000000   0.076000 (  0.076000)
require 'time'                  0.049000   0.000000   0.049000 (  0.049000)
require 'time'                  0.047000   0.000000   0.047000 (  0.047000)
require 'time'                  0.040000   0.000000   0.040000 (  0.040000)
require 'time'                  0.039000   0.000000   0.039000 (  0.039000)
require 'time'                  0.056000   0.000000   0.056000 (  0.056000)
require 'time'                  0.023000   0.000000   0.023000 (  0.023000)
require 'time'                  0.026000   0.000000   0.026000 (  0.026000)
require 'time'                  0.026000   0.000000   0.026000 (  0.026000)

require_protection without LOADED_FEATURES Hash patch

% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.026000   0.000000   1.026000 (  0.956000)
require 'time'                  0.151000   0.000000   0.151000 (  0.151000)
require 'time'                  0.049000   0.000000   0.049000 (  0.049000)
require 'time'                  0.036000   0.000000   0.036000 (  0.037000)
require 'time'                  0.042000   0.000000   0.042000 (  0.042000)
require 'time'                  0.038000   0.000000   0.038000 (  0.038000)
require 'time'                  0.018000   0.000000   0.018000 (  0.018000)
require 'time'                  0.026000   0.000000   0.026000 (  0.025000)
require 'time'                  0.021000   0.000000   0.021000 (  0.021000)
require 'time'                  0.019000   0.000000   0.019000 (  0.020000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.303000   0.000000   0.303000 (  0.303000)
require 'time'                  0.171000   0.000000   0.171000 (  0.171000)
require 'time'                  0.132000   0.000000   0.132000 (  0.132000)
require 'time'                  0.122000   0.000000   0.122000 (  0.122000)
require 'time'                  0.059000   0.000000   0.059000 (  0.059000)
require 'time'                  0.048000   0.000000   0.048000 (  0.048000)
require 'time'                  0.041000   0.000000   0.041000 (  0.041000)
require 'time'                  0.049000   0.000000   0.049000 (  0.048000)
require 'time'                  0.059000   0.000000   0.059000 (  0.059000)
require 'time'                  0.065000   0.000000   0.065000 (  0.065000)
% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.010000   0.000000   1.010000 (  0.949000)
require 'time'                  0.165000   0.000000   0.165000 (  0.165000)
require 'time'                  0.052000   0.000000   0.052000 (  0.053000)
require 'time'                  0.054000   0.000000   0.054000 (  0.054000)
require 'time'                  0.037000   0.000000   0.037000 (  0.037000)
require 'time'                  0.037000   0.000000   0.037000 (  0.037000)
require 'time'                  0.020000   0.000000   0.020000 (  0.019000)
require 'time'                  0.033000   0.000000   0.033000 (  0.033000)
require 'time'                  0.021000   0.000000   0.021000 (  0.021000)
require 'time'                  0.030000   0.000000   0.030000 (  0.030000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.261000   0.000000   0.261000 (  0.261000)
require 'time'                  0.165000   0.000000   0.165000 (  0.165000)
require 'time'                  0.087000   0.000000   0.087000 (  0.088000)
require 'time'                  0.083000   0.000000   0.083000 (  0.083000)
require 'time'                  0.036000   0.000000   0.036000 (  0.037000)
require 'time'                  0.038000   0.000000   0.038000 (  0.038000)
require 'time'                  0.038000   0.000000   0.038000 (  0.039000)
require 'time'                  0.042000   0.000000   0.042000 (  0.041000)
require 'time'                  0.046000   0.000000   0.046000 (  0.047000)
require 'time'                  0.053000   0.000000   0.053000 (  0.054000)

jruby-1_6

% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.135000   0.000000   1.135000 (  1.075000)
require 'time'                  0.377000   0.000000   0.377000 (  0.377000)
require 'time'                  0.184000   0.000000   0.184000 (  0.184000)
require 'time'                  0.143000   0.000000   0.143000 (  0.143000)
require 'time'                  0.117000   0.000000   0.117000 (  0.117000)
require 'time'                  0.139000   0.000000   0.139000 (  0.139000)
require 'time'                  0.124000   0.000000   0.124000 (  0.124000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.132000   0.000000   0.132000 (  0.132000)
require 'time'                  0.117000   0.000000   0.117000 (  0.117000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.371000   0.000000   0.371000 (  0.371000)
require 'time'                  0.192000   0.000000   0.192000 (  0.192000)
require 'time'                  0.196000   0.000000   0.196000 (  0.197000)
require 'time'                  0.198000   0.000000   0.198000 (  0.198000)
require 'time'                  0.217000   0.000000   0.217000 (  0.217000)
require 'time'                  0.154000   0.000000   0.154000 (  0.154000)
require 'time'                  0.173000   0.000000   0.173000 (  0.173000)
require 'time'                  0.158000   0.000000   0.158000 (  0.158000)
require 'time'                  0.156000   0.000000   0.156000 (  0.156000)
require 'time'                  0.154000   0.000000   0.154000 (  0.154000)
% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.146000   0.000000   1.146000 (  1.084000)
require 'time'                  0.358000   0.000000   0.358000 (  0.358000)
require 'time'                  0.180000   0.000000   0.180000 (  0.180000)
require 'time'                  0.149000   0.000000   0.149000 (  0.149000)
require 'time'                  0.120000   0.000000   0.120000 (  0.120000)
require 'time'                  0.125000   0.000000   0.125000 (  0.125000)
require 'time'                  0.121000   0.000000   0.121000 (  0.122000)
require 'time'                  0.141000   0.000000   0.141000 (  0.141000)
require 'time'                  0.137000   0.000000   0.137000 (  0.137000)
require 'time'                  0.116000   0.000000   0.116000 (  0.116000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.300000   0.000000   0.300000 (  0.299000)
require 'time'                  0.194000   0.000000   0.194000 (  0.195000)
require 'time'                  0.193000   0.000000   0.193000 (  0.192000)
require 'time'                  0.195000   0.000000   0.195000 (  0.195000)
require 'time'                  0.216000   0.000000   0.216000 (  0.216000)
require 'time'                  0.151000   0.000000   0.151000 (  0.151000)
require 'time'                  0.159000   0.000000   0.159000 (  0.159000)
require 'time'                  0.174000   0.000000   0.174000 (  0.174000)
require 'time'                  0.156000   0.000000   0.156000 (  0.156000)
require 'time'                  0.157000   0.000000   0.157000 (  0.157000)

master with LOADED_FEATURES Hash patch

% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.216000   0.000000   1.216000 (  1.152000)
require 'time'                  0.241000   0.000000   0.241000 (  0.241000)
require 'time'                  0.156000   0.000000   0.156000 (  0.156000)
require 'time'                  0.129000   0.000000   0.129000 (  0.129000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.147000   0.000000   0.147000 (  0.147000)
require 'time'                  0.149000   0.000000   0.149000 (  0.149000)
require 'time'                  0.118000   0.000000   0.118000 (  0.118000)
require 'time'                  0.120000   0.000000   0.120000 (  0.120000)
require 'time'                  0.124000   0.000000   0.124000 (  0.124000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.334000   0.000000   0.334000 (  0.334000)
require 'time'                  0.238000   0.000000   0.238000 (  0.238000)
require 'time'                  0.150000   0.000000   0.150000 (  0.151000)
require 'time'                  0.144000   0.000000   0.144000 (  0.144000)
require 'time'                  0.147000   0.000000   0.147000 (  0.147000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.159000   0.000000   0.159000 (  0.159000)
require 'time'                  0.138000   0.000000   0.138000 (  0.138000)
require 'time'                  0.141000   0.000000   0.141000 (  0.141000)
require 'time'                  0.147000   0.000000   0.147000 (  0.147000)
% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.243000   0.000000   1.243000 (  1.179000)
require 'time'                  0.254000   0.000000   0.254000 (  0.254000)
require 'time'                  0.152000   0.000000   0.152000 (  0.152000)
require 'time'                  0.125000   0.000000   0.125000 (  0.125000)
require 'time'                  0.131000   0.000000   0.131000 (  0.131000)
require 'time'                  0.144000   0.000000   0.144000 (  0.144000)
require 'time'                  0.157000   0.000000   0.157000 (  0.157000)
require 'time'                  0.124000   0.000000   0.124000 (  0.125000)
require 'time'                  0.125000   0.000000   0.125000 (  0.125000)
require 'time'                  0.127000   0.000000   0.127000 (  0.127000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.416000   0.000000   0.416000 (  0.416000)
require 'time'                  0.282000   0.000000   0.282000 (  0.282000)
require 'time'                  0.186000   0.000000   0.186000 (  0.186000)
require 'time'                  0.182000   0.000000   0.182000 (  0.182000)
require 'time'                  0.180000   0.000000   0.180000 (  0.180000)
require 'time'                  0.170000   0.000000   0.170000 (  0.170000)
require 'time'                  0.192000   0.000000   0.192000 (  0.192000)
require 'time'                  0.178000   0.000000   0.178000 (  0.178000)
require 'time'                  0.180000   0.000000   0.180000 (  0.180000)
require 'time'                  0.187000   0.000000   0.187000 (  0.187000)

master without LOADED_FEATURES Hash patch

% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.115000   0.000000   1.115000 (  1.042000)
require 'time'                  0.249000   0.000000   0.249000 (  0.249000)
require 'time'                  0.139000   0.000000   0.139000 (  0.139000)
require 'time'                  0.144000   0.000000   0.144000 (  0.144000)
require 'time'                  0.124000   0.000000   0.124000 (  0.124000)
require 'time'                  0.128000   0.000000   0.128000 (  0.129000)
require 'time'                  0.126000   0.000000   0.126000 (  0.126000)
require 'time'                  0.140000   0.000000   0.140000 (  0.140000)
require 'time'                  0.132000   0.000000   0.132000 (  0.132000)
require 'time'                  0.118000   0.000000   0.118000 (  0.118000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.324000   0.000000   0.324000 (  0.324000)
require 'time'                  0.200000   0.000000   0.200000 (  0.200000)
require 'time'                  0.194000   0.000000   0.194000 (  0.194000)
require 'time'                  0.184000   0.000000   0.184000 (  0.185000)
require 'time'                  0.195000   0.000000   0.195000 (  0.195000)
require 'time'                  0.138000   0.000000   0.138000 (  0.138000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.148000   0.000000   0.148000 (  0.148000)
% jruby bench/bench_time_require.rb 10
                                    user     system      total        real
require 'time'                  1.087000   0.000000   1.087000 (  1.020000)
require 'time'                  0.247000   0.000000   0.247000 (  0.247000)
require 'time'                  0.143000   0.000000   0.143000 (  0.143000)
require 'time'                  0.125000   0.000000   0.125000 (  0.125000)
require 'time'                  0.141000   0.000000   0.141000 (  0.141000)
require 'time'                  0.118000   0.000000   0.118000 (  0.119000)
require 'time'                  0.113000   0.000000   0.113000 (  0.113000)
require 'time'                  0.123000   0.000000   0.123000 (  0.123000)
require 'time'                  0.145000   0.000000   0.145000 (  0.145000)
require 'time'                  0.115000   0.000000   0.115000 (  0.116000)
Now with rubygems and activerecord
                                    user     system      total        real
require 'time'                  0.373000   0.000000   0.373000 (  0.373000)
require 'time'                  0.260000   0.000000   0.260000 (  0.260000)
require 'time'                  0.214000   0.000000   0.214000 (  0.214000)
require 'time'                  0.240000   0.000000   0.240000 (  0.241000)
require 'time'                  0.219000   0.000000   0.219000 (  0.220000)
require 'time'                  0.175000   0.000000   0.175000 (  0.175000)
require 'time'                  0.178000   0.000000   0.178000 (  0.178000)
require 'time'                  0.190000   0.000000   0.190000 (  0.191000)
require 'time'                  0.176000   0.000000   0.176000 (  0.176000)
require 'time'                  0.164000   0.000000   0.164000 (  0.164000)
diff --git a/src/org/jruby/runtime/load/LoadService.java b/src/org/jruby/runtime/load/LoadService.java
index ce97228..5d1da1d 100644
--- a/src/org/jruby/runtime/load/LoadService.java
+++ b/src/org/jruby/runtime/load/LoadService.java
@@ -241,8 +241,8 @@ public class LoadService {
}
}
- protected void addLoadedFeature(RubyString loadNameRubyString) {
- loadedFeatures.append(loadNameRubyString);
+ protected void addLoadedFeature(String name) {
+ loadedFeatures.append(RubyString.newString(runtime, name));
}
protected void addPath(String path) {
@@ -396,8 +396,7 @@ public class LoadService {
boolean loaded = tryLoadingLibraryOrScript(runtime, state);
if (loaded) {
- RubyString requireName = RubyString.newString(runtime, state.loadName);
- addLoadedFeature(requireName);
+ addLoadedFeature(state.loadName);
}
return loaded;
}
@@ -507,8 +506,7 @@ public class LoadService {
}
protected boolean featureAlreadyLoaded(String name) {
- RubyString loadNameRubyString = runtime.newString(name);
- return loadedFeatures.include_p(runtime.getCurrentContext(), loadNameRubyString).isTrue();
+ return loadedFeatures.containsString(name);
}
protected boolean isJarfileLibrary(SearchState state, final String file) {
diff --git a/src/org/jruby/util/collections/StringArraySet.java b/src/org/jruby/util/collections/StringArrayS
et.java
index 2d78ca2..4c75693 100644
--- a/src/org/jruby/util/collections/StringArraySet.java
+++ b/src/org/jruby/util/collections/StringArraySet.java
@@ -344,6 +344,10 @@ public class StringArraySet extends RubyArray {
return result;
}
+ public synchronized boolean containsString(String element) {
+ return set.contains(element);
+ }
+
private String getStringFromItem(IRubyObject item) {
String string = item.convertToString().asJavaString();
if (caseInsensitive) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment