multi_fetch_fragments icon indicating copy to clipboard operation
multi_fetch_fragments copied to clipboard

Multi fetch slower than no cache because of digest calculation

Open pepesenaris opened this issue 9 years ago • 5 comments

I have the following scenario: A partial rendered ( called _folder_results_table.html.erb) every 5 ms in a js view like this. "<%= j(render('folder_results_table')) %>"; and within that partial I'm trying to render and cache a collection of hashes using this gem, like this: <%= render :partial => "result_asset", collection: @somegroups, as: :result, locals: {group_name: group_name, group_name_to_id: group_name_to_id } , cache: Proc.new { |item| [ item[:result][:asset], item[:job][:id], item[:name_collides] ] } %>

The problem is that the digest for the parent cache is calculated in every item of the collection as given by the Rails log

Cache digest for folders/_folder_results_table.html: 44ebc3150678502edd950093fd618343 Cache digest for folders/result_asset.html: 46e854eaa29fb504ccd6786e10617704 ... a 100 items later Cache digest for folders/_folder_results_table.html: 44ebc3150678502edd950093fd618343 Cache digest for folders/result_asset.html: 46e854eaa29fb504ccd6786e10617704.

Why does the digests needs to be calculated in every item? This slowing the process some much that it's faster to not cache the result_asset partial at all. Is there any workaround, or I'm just stuck to not caching the collection which in real production data can have hundreds of elements and will be rendered every 5 sec or so (I know this is bad but right now can not be changed).

Best Regards

pepesenaris avatar Jun 02 '15 14:06 pepesenaris

@pepesenaris This isn't a multi_fetch_fragments issue, this is just rails caching, and most likely just your default settings for development (in production, digests are not usually recalculated every time).

travisp avatar Jul 04 '15 16:07 travisp

Thanks for your response.

Hmmm, i see, it makes sense that in production digests are not recalculated.... Do you have any idea of which settings should be set in development to simulate that particular behaviour?

Cheers

pepesenaris avatar Jul 06 '15 14:07 pepesenaris

I also had to set config.cache_classes = true in development.rb so that the digests aren't recalculated.

coderdave avatar Oct 10 '15 13:10 coderdave

even with config.cache_classes = true the problem persists for me. it may not have anything to do with the gem but I noticed that once the gem is loaded and partial rendering is set up template digests will be upfront -- without the gem the cache digesting is sparse in logs, so one might not notice at first.

however it's a very strange behavior, my cached partial renders 3/4 more partials and each one needs to be digested at every loop, consuming up to 90% of the request time in my case.

maybe this https://github.com/indirect/haml-rails/pull/51/files#diff-d6edf10e631b76d76eb4f9d9f6908471R41 can help with haml users

masterkain avatar Feb 13 '16 01:02 masterkain

I had the same issue, this hotfix works around it: https://github.com/ghiculescu/multi_fetch_fragments/commit/59612d54fc3f9bc38170f9c74b5e753a814f3578

ghiculescu avatar Jun 20 '16 08:06 ghiculescu