[Bug #20641] Gem::BUNDLED_GEMS.warning? adds a lot of extra
work on top of require. When the call end up atually loading code
the overhead is somewhat marginal.
However it's not uncommon for code to go some late require in some
paths, so it's expected that calling require with something already
required is somewhat fast, and bundled_gems.rb breaks this assumption.
To avoid this, we can have a fast path that in most case allow to
short-circuit all the heavy computations. If we extract the feature
basename and it doesn't match any of the bundled gems we care about
we can return very early.
With this change require 'date' is now only 1.33x slower on Ruby
3.3.3, than it was on Ruby 3.2.2, whereas before this change it
was at least 100x slower.
bundled_gems.rb: Add a fast path (#11221)
bundled_gems.rb: Add a fast path
[Bug #20641]
Gem::BUNDLED_GEMS.warning?
adds a lot of extrawork on top of
require
. When the call end up atually loading codethe overhead is somewhat marginal.
However it's not uncommon for code to go some late
require
in somepaths, so it's expected that calling
require
with something alreadyrequired is somewhat fast, and
bundled_gems.rb
breaks this assumption.To avoid this, we can have a fast path that in most case allow to
short-circuit all the heavy computations. If we extract the feature
basename and it doesn't match any of the bundled gems we care about
we can return very early.
With this change
require 'date'
is now only 1.33x slower on Ruby3.3.3, than it was on Ruby 3.2.2, whereas before this change it
was at least 100x slower.
Co-authored-by: Jean Boussier [email protected]