Project

General

Profile

« Previous | Next » 

Revision cf02692f

Added by watson1978 (Shizuo Fujita) almost 7 years ago

Improve performance of Enumerable#{sort_by,min_by,max_by,minmax_by}

This is totally same approach with r58964.

enum.c (sort_by_cmp): use OPTIMIZED_CMP() to compare the objects instead of
`<=>' method dispatching for Fixnum/Float/String object.

enum.c (nmin_cmp): ditto.
enum.c (min_by_i): ditto.
enum.c (max_by_i): ditto.
enum.c (minmax_by_i_update): ditto.
enum.c (minmax_by_i): ditto.

Enumerable#sort_by   -> 51 % up
Enumerable#min_by(n) -> 34 % up
Enumerable#min_by    -> 37 % up
Enumerable#max_by(n) -> 61 % up
Enumerable#max_by    -> 40 % up
Enumerable#minmax_by -> 67 % up

[ruby-core:80689] [Bug #13437] [Fix GH-1584]

Before

Enumerable#sort_by 5.692k (± 2.2%) i/s - 28.611k in 5.028861s
Enumerable#min_by(n) 8.496k (± 0.5%) i/s - 43.146k in 5.078394s
Enumerable#min_by 8.678k (± 0.5%) i/s - 43.911k in 5.060128s
Enumerable#max_by(n) 3.306k (± 3.0%) i/s - 16.562k in 5.014727s
Enumerable#max_by 8.322k (± 2.8%) i/s - 42.400k in 5.099400s
Enumerable#minmax_by 6.769k (± 2.6%) i/s - 34.100k in 5.041354s

After

Enumerable#sort_by 8.591k (± 3.0%) i/s - 43.316k in 5.046836s
Enumerable#min_by(n) 11.489k (± 1.2%) i/s - 57.732k in 5.025504s
Enumerable#min_by 11.835k (± 2.7%) i/s - 60.150k in 5.086450s
Enumerable#max_by(n) 5.322k (± 1.1%) i/s - 26.650k in 5.008289s
Enumerable#max_by 11.705k (± 0.6%) i/s - 59.262k in 5.062997s
Enumerable#minmax_by 11.323k (± 1.3%) i/s - 57.018k in 5.036565s

Test code

require 'benchmark/ips'

Benchmark.ips do |x|
enum = (1..1000).to_a.to_enum

x.report "Enumerable#sort_by" do
enum.sort_by { |a| a }
end

x.report "Enumerable#min_by(n)" do
enum.min_by(2) { |a| a }
end

x.report "Enumerable#min_by" do
enum.min_by { |a| a }
end

x.report "Enumerable#max_by(n)" do
enum.max_by(2) { |a| a }
end

x.report "Enumerable#max_by" do
enum.max_by { |a| a }
end

x.report "Enumerable#minmax_by" do
enum.minmax_by { |a| a }
end
end

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e