1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[rubygems/rubygems] Avoid duplicated generation of APISpecification objects

As far as I could see, `Gem::Resolver::APISpecification` objects are
supposed to be immutable.  If my guessing is correct, then we can cache
and reuse its instances for performance.
At least, `rake` passes on my machine.

Before this change:

```
$ time ruby -I lib bin/gem install --no-doc aws-sdk
Successfully installed aws-sdk-3.0.1
1 gem installed
real    0m37.104s
user    0m36.952s
sys     0m0.333s
```

After this change:

```
$ time ruby -I lib bin/gem install --no-doc aws-sdk
Successfully installed aws-sdk-3.0.1
1 gem installed
real    0m23.905s
user    0m23.740s
sys     0m0.365s
```

https://github.com/rubygems/rubygems/commit/7e8fbba85c
This commit is contained in:
Yusuke Endoh 2020-09-11 12:00:29 +09:00 committed by Hiroshi SHIBATA
parent 91865230cd
commit c55b5f1062
Notes: git 2020-09-28 14:54:53 +09:00

View file

@ -6,6 +6,17 @@
# is the name, version, and dependencies.
class Gem::Resolver::APISpecification < Gem::Resolver::Specification
##
# We assume that all instances of this class are immutable;
# so avoid duplicated generation for performance.
@@cache = {}
def self.new(set, api_data)
cache_key = [set, api_data]
cache = @@cache[cache_key]
return cache if cache
@@cache[cache_key] = super
end
##
# Creates an APISpecification for the given +set+ from the rubygems.org
# +api_data+.
@ -18,12 +29,12 @@ class Gem::Resolver::APISpecification < Gem::Resolver::Specification
@set = set
@name = api_data[:name]
@version = Gem::Version.new api_data[:number]
@platform = Gem::Platform.new api_data[:platform]
@original_platform = api_data[:platform]
@version = Gem::Version.new(api_data[:number]).freeze
@platform = Gem::Platform.new(api_data[:platform]).freeze
@original_platform = api_data[:platform].freeze
@dependencies = api_data[:dependencies].map do |name, ver|
Gem::Dependency.new name, ver.split(/\s*,\s*/)
end
Gem::Dependency.new(name, ver.split(/\s*,\s*/)).freeze
end.freeze
end
def ==(other) # :nodoc: