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:
parent
91865230cd
commit
c55b5f1062
Notes:
git
2020-09-28 14:54:53 +09:00
1 changed files with 16 additions and 5 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue