aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/result.rb
diff options
context:
space:
mode:
authorSam <sam.saffron@gmail.com>2013-08-29 12:23:15 +1000
committerSam <sam.saffron@gmail.com>2013-08-29 14:06:24 +1000
commitba0568e46d890d57cfef2ea86745bdeb879fefa7 (patch)
tree48fdff238fe7234fca5bc343ce358ec3cfd1a3b3 /activerecord/lib/active_record/result.rb
parentfb321017b6eab5c3f0c0c3187585674412ec53ae (diff)
downloadrails-ba0568e46d890d57cfef2ea86745bdeb879fefa7.tar.gz
rails-ba0568e46d890d57cfef2ea86745bdeb879fefa7.tar.bz2
rails-ba0568e46d890d57cfef2ea86745bdeb879fefa7.zip
Perf: micro optimised Result column hash_row creation
Diffstat (limited to 'activerecord/lib/active_record/result.rb')
-rw-r--r--activerecord/lib/active_record/result.rb16
1 files changed, 15 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/result.rb b/activerecord/lib/active_record/result.rb
index 253368ae5b..d0f1cb5b75 100644
--- a/activerecord/lib/active_record/result.rb
+++ b/activerecord/lib/active_record/result.rb
@@ -93,7 +93,21 @@ module ActiveRecord
# used as keys in ActiveRecord::Base's @attributes hash
columns = @columns.map { |c| c.dup.freeze }
@rows.map { |row|
- Hash[columns.zip(row)]
+ # In the past we used Hash[columns.zip(row)]
+ # though elegant, the verbose way is much more efficient
+ # both time and memory wise cause it avoids a big array allocation
+ # this method is called a lot and needs to be micro optimised
+ hash = {}
+
+ index = 0
+ length = columns.length
+
+ while index < length
+ hash[columns[index]] = row[index]
+ index += 1
+ end
+
+ hash
}
end
end