Project

General

Profile

Actions

Feature #12639

closed

Speed up require in RubyGems by 5x

Feature #12639: Speed up require in RubyGems by 5x

Added by segiddins (Samuel Giddins) almost 10 years ago. Updated 15 days ago.

Status:
Closed
Target version:
-
[ruby-core:76625]

Description

This patch makes requiring an already-loaded file approximated 5x faster when the RubyGems mixin for require is present.
Benchmarked via the following script:

require "rubygems"
require "benchmark/ips"

Benchmark.ips do |x|
	x.report("ruby") { gem_original_require "rubygems" }
	x.report("rubygems") { require "rubygems" }
	
	x.compare!
end

I understand that it's not ideal to add new global functions, and I'd appreciate guidance on where else I could expose this functionality to ruby code.

Thanks :)


Files

feature_loaded.patch (1.85 KB) feature_loaded.patch segiddins (Samuel Giddins), 07/31/2016 01:04 AM

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago Actions #1 [ruby-core:76626]

I'm not sure if it is acceptable for rubygems to skip loaded features.

+VALUE
+rb_f_loaded_feature(VALUE obj, VALUE fname)
+{
+  return rb_provided(RSTRING_PTR(rb_str_encode_ospath(fname))) ? Qtrue : Qfalse;
+}

Why is this function global?
And the argument of RSTRING_PTR should not have side effects.

Updated by hsbt (Hiroshi SHIBATA) almost 8 years ago Actions #2 [ruby-core:88114]

  • Status changed from Open to Assigned
  • Assignee set to hsbt (Hiroshi SHIBATA)

Updated by hsbt (Hiroshi SHIBATA) 15 days ago Actions #3 [ruby-core:125718]

  • Status changed from Assigned to Closed

The performance gap this patch targeted has been mostly eliminated by incremental optimizations in RubyGems since 2016.

Running the benchmark in the description on current master shows 1.47x (about 80ns per call) instead of 5x, because the require hook now returns early when there are no unresolved dependencies. Additionally, since RubyGems 3.5, Bundler disables the require decoration entirely after bundler/setup via Gem.discover_gems_on_require. The remaining overhead is too small to justify adding a new C API, so I'm closing this issue.

Actions

Also available in: PDF Atom