[rubygems/rubygems] Remove array allocation from Candidate#<=>
In a large application I profiled allocations while running `bundle update` and found that this method was ~60% of allocations while resolving (and Candidate#<=> is almost half of the total runtime). This commit removes the array allocation in Candidate#<=> (and similar methods since the implementations are so simple). The array is always the same two elements so they can just be compared directly. https://github.com/rubygems/rubygems/commit/6a7c411ba7
This commit is contained in:
parent
af76b7f4d9
commit
8cc85dc00f
@ -48,35 +48,38 @@ module Bundler
|
||||
@version.segments
|
||||
end
|
||||
|
||||
def sort_obj
|
||||
[@version, @priority]
|
||||
end
|
||||
|
||||
def <=>(other)
|
||||
return unless other.is_a?(self.class)
|
||||
|
||||
sort_obj <=> other.sort_obj
|
||||
version_comparison = version <=> other.version
|
||||
return version_comparison unless version_comparison.zero?
|
||||
|
||||
priority <=> other.priority
|
||||
end
|
||||
|
||||
def ==(other)
|
||||
return unless other.is_a?(self.class)
|
||||
|
||||
sort_obj == other.sort_obj
|
||||
version == other.version && priority == other.priority
|
||||
end
|
||||
|
||||
def eql?(other)
|
||||
return unless other.is_a?(self.class)
|
||||
|
||||
sort_obj.eql?(other.sort_obj)
|
||||
version.eql?(other.version) && priority.eql?(other.priority)
|
||||
end
|
||||
|
||||
def hash
|
||||
sort_obj.hash
|
||||
[@version, @priority].hash
|
||||
end
|
||||
|
||||
def to_s
|
||||
@version.to_s
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
attr_reader :priority
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user