diff options
author | lvl0nax <lvl0nax@gmail.com> | 2016-05-13 16:43:01 +0300 |
---|---|---|
committer | lvl0nax <lvl0nax@gmail.com> | 2016-05-14 09:16:30 +0300 |
commit | 6751b1032070a3b26e89a151cbe564a354eb580d (patch) | |
tree | 9780a7c78d04b23826617f1b6583559830b07511 | |
parent | b6429b871ff8b73ebd10076ead6ed2c1f651da86 (diff) | |
download | rails-6751b1032070a3b26e89a151cbe564a354eb580d.tar.gz rails-6751b1032070a3b26e89a151cbe564a354eb580d.tar.bz2 rails-6751b1032070a3b26e89a151cbe564a354eb580d.zip |
Perfomance fix for Enumerable#index_by
Calculating -------------------------------------
before 34.731k i/100ms
after 48.206k i/100ms
-------------------------------------------------
before 508.451k (± 1.2%) i/s - 2.570M
after 720.068k (± 0.9%) i/s - 3.615M
Comparison:
after: 720067.6 i/s
before: 508451.1 i/s - 1.42x slower
-rw-r--r-- | activesupport/lib/active_support/core_ext/enumerable.rb | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/core_ext/enumerable.rb b/activesupport/lib/active_support/core_ext/enumerable.rb index 9a893157ea..8ebe758078 100644 --- a/activesupport/lib/active_support/core_ext/enumerable.rb +++ b/activesupport/lib/active_support/core_ext/enumerable.rb @@ -34,7 +34,9 @@ module Enumerable # => { "Chade- Fowlersburg-e" => <Person ...>, "David Heinemeier Hansson" => <Person ...>, ...} def index_by if block_given? - Hash[map { |elem| [yield(elem), elem] }] + result = {} + each { |elem| result[yield(elem)] = elem } + result else to_enum(:index_by) { size if respond_to?(:size) } end |