aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschneems <richard.schneeman+foo@gmail.com>2018-09-20 23:09:10 -0500
committerschneems <richard.schneeman+foo@gmail.com>2018-09-21 17:33:17 -0500
commit6da99b4e99c90c63015f0d1cb4bf10983ea26a36 (patch)
treee8eb9495ea8d4dbdd89d0631e0ef9517343060b2
parenta44b7f180d0f03613479fb227d09ce2d7f74a187 (diff)
downloadrails-6da99b4e99c90c63015f0d1cb4bf10983ea26a36.tar.gz
rails-6da99b4e99c90c63015f0d1cb4bf10983ea26a36.tar.bz2
rails-6da99b4e99c90c63015f0d1cb4bf10983ea26a36.zip
Decrease memory allocations in cache.rb
The `merged_options` method is private and the output is never mutated. Using this info we can get rid of the `dup` behavior. We can also eliminate the `merge` call in the case where all the options being merged are the same. Returned results are frozen as an extra layer of protection against mutation. Before ``` Total allocated: 741749 bytes (6642 objects) ``` After ``` Total allocated: 734039 bytes (6648 objects) ``` Diff ``` (741749 - 734039) / 741749.0 => ~ 1.0 % ``` If you don't feel comfortable modifying this method, we could rename it and only use it internally.
-rw-r--r--activesupport/lib/active_support/cache.rb8
1 files changed, 6 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb
index 8e516de4c9..1d8a90ed0e 100644
--- a/activesupport/lib/active_support/cache.rb
+++ b/activesupport/lib/active_support/cache.rb
@@ -596,9 +596,13 @@ module ActiveSupport
# Merges the default options with ones specific to a method call.
def merged_options(call_options)
if call_options
- options.merge(call_options)
+ if options.empty?
+ call_options
+ else
+ options.merge(call_options)
+ end
else
- options.dup
+ options
end
end