aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorlvl0nax <lvl0nax@gmail.com>2016-05-13 16:43:01 +0300
committerlvl0nax <lvl0nax@gmail.com>2016-05-14 09:16:30 +0300
commit6751b1032070a3b26e89a151cbe564a354eb580d (patch)
tree9780a7c78d04b23826617f1b6583559830b07511 /activesupport
parentb6429b871ff8b73ebd10076ead6ed2c1f651da86 (diff)
downloadrails-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
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/core_ext/enumerable.rb4
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