diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2016-02-18 11:09:15 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2016-02-18 11:10:43 -0800 |
commit | 8bb52f929f36994fd5b42295d24b627f132fe318 (patch) | |
tree | 8f31e749813bc247d9f4f24e064bd47ced3f9d5e /actionview/lib | |
parent | fb8d01f1ef7da0a3c8c0173d6c3da59afe9d1ca5 (diff) | |
download | rails-8bb52f929f36994fd5b42295d24b627f132fe318.tar.gz rails-8bb52f929f36994fd5b42295d24b627f132fe318.tar.bz2 rails-8bb52f929f36994fd5b42295d24b627f132fe318.zip |
cache all subnodes in the digest cache
this is for backwards compatibility. We should remove this after
5-0-stable is created because digest calculation should be amortized.
Caching digests of subtrees will speed up digests for other trees that
share the same children. However, this will also increase memory, and
after the app warms up, then those subtrees will never be reused which
means that memory is wasted.
Diffstat (limited to 'actionview/lib')
-rw-r--r-- | actionview/lib/action_view/digestor.rb | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/actionview/lib/action_view/digestor.rb b/actionview/lib/action_view/digestor.rb index 07600f2092..518f0da16c 100644 --- a/actionview/lib/action_view/digestor.rb +++ b/actionview/lib/action_view/digestor.rb @@ -28,7 +28,7 @@ module ActionView # (Concurrent::Map's lookups have volatile semantics) finder.digest_cache[cache_key] || @@digest_mutex.synchronize do finder.digest_cache.fetch(cache_key) do # re-check under lock - finder.digest_cache[cache_key] = tree(name, finder, dependencies).digest + finder.digest_cache[cache_key] = tree(name, finder, dependencies).digest(finder) end end end @@ -83,17 +83,19 @@ module ActionView @children = children end - def digest(stack = []) - Digest::MD5.hexdigest("#{template.source}-#{dependency_digest(stack)}") + def digest(finder, stack = []) + Digest::MD5.hexdigest("#{template.source}-#{dependency_digest(finder, stack)}") end - def dependency_digest(stack) + def dependency_digest(finder, stack) children.map do |node| if stack.include?(node) false else - stack.push node - node.digest(stack).tap { stack.pop } + finder.digest_cache[node.name] ||= begin + stack.push node + node.digest(finder, stack).tap { stack.pop } + end end end.join("-") end @@ -106,11 +108,11 @@ module ActionView class Partial < Node; end class Missing < Node - def digest(_ = []) '' end + def digest(finder, _ = []) '' end end class Injected < Node - def digest(_ = []) name end + def digest(finder, _ = []) name end end class NullLogger |