[rubygems/rubygems] (Further) Improve Bundler::Settings#[] performance and memory usage

I previously identified and improved this method over in https://github.com/rubygems/rubygems/pull/6884
but while reviewing another memory_profiler profile, I realized another
gain we can eek out.

This method keeps comes up in part because `configs` is allocating a new
Hash every time. My last change took advantage of that by using `map!`
on it. `configs` is called quite often, including in this `[]` method,
so there's a benefit to memoizing it.

Back in `[]`, logically we are trying to find the first Hash in `configs`
that has a value for the given key. Currently, we end up `map` and
`compact` to just get that value.

Instead, we can use a loop over `configs`, and break when we find the
value for the key.

https://github.com/rubygems/rubygems/commit/b913cfc87b
This commit is contained in:
Josh Nichols 2023-08-28 20:02:08 -04:00 committed by git
parent 27024004fa
commit 6a876a61d7

View File

@ -102,10 +102,13 @@ module Bundler
def [](name)
key = key_for(name)
values = configs.values
values.map! {|config| config[key] }
values.compact!
value = values.first
value = nil
configs.each do |_, config|
if config[key]
value = config[key]
break
end
end
converted_value(value, name)
end
@ -316,7 +319,7 @@ module Bundler
private
def configs
{
@configs ||= {
:temporary => @temporary,
:local => @local_config,
:env => @env_config,