aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/template.rb
Commit message (Collapse)AuthorAgeFilesLines
* Cut string ActionView template allocationsschneems2015-07-291-2/+7
| | | | | | The instrument method creates new strings, the most common action to instrument is "!render_template` so we can detect when that action is occurring and use a frozen string instead. This change buys us 113,714 bytes of memory and 1,790 fewer objects per request.
* Freeze string literals when not mutated.schneems2015-07-191-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I wrote a utility that helps find areas where you could optimize your program using a frozen string instead of a string literal, it's called [let_it_go](https://github.com/schneems/let_it_go). After going through the output and adding `.freeze` I was able to eliminate the creation of 1,114 string objects on EVERY request to [codetriage](codetriage.com). How does this impact execution? To look at memory: ```ruby require 'get_process_mem' mem = GetProcessMem.new GC.start GC.disable 1_114.times { " " } before = mem.mb after = mem.mb GC.enable puts "Diff: #{after - before} mb" ``` Creating 1,114 string objects results in `Diff: 0.03125 mb` of RAM allocated on every request. Or 1mb every 32 requests. To look at raw speed: ```ruby require 'benchmark/ips' number_of_objects_reduced = 1_114 Benchmark.ips do |x| x.report("freeze") { number_of_objects_reduced.times { " ".freeze } } x.report("no-freeze") { number_of_objects_reduced.times { " " } } end ``` We get the results ``` Calculating ------------------------------------- freeze 1.428k i/100ms no-freeze 609.000 i/100ms ------------------------------------------------- freeze 14.363k (± 8.5%) i/s - 71.400k no-freeze 6.084k (± 8.1%) i/s - 30.450k ``` Now we can do some maths: ```ruby ips = 6_226k # iterations / 1 second call_time_before = 1.0 / ips # seconds per iteration ips = 15_254 # iterations / 1 second call_time_after = 1.0 / ips # seconds per iteration diff = call_time_before - call_time_after number_of_objects_reduced * diff * 100 # => 0.4530373333993266 miliseconds saved per request ``` So we're shaving off 1 second of execution time for every 220 requests. Is this going to be an insane speed boost to any Rails app: nope. Should we merge it: yep. p.s. If you know of a method call that doesn't modify a string input such as [String#gsub](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37) please [give me a pull request to the appropriate file](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37), or open an issue in LetItGo so we can track and freeze more strings. Keep those strings Frozen ![](https://www.dropbox.com/s/z4dj9fdsv213r4v/let-it-go.gif?dl=1)
* Support explicit defintion of resouce name for collection caching.Dov Murik2015-07-071-4/+13
| | | | | | | | | | | | | | If a template includes `# Template Collection: ...` anywhere in its source, that name will be used as the cache name for the partial that is rendered for the collection. This allows users to enable collection caching even if the template doesn't start with `<% cache ... do %>`. Moreover, the `# Template Collection: ...` notation is recognized in all template types (and template types other than ERB can define a resource_cache_call_pattern method to allow the `cache ... do` pattern to be recognized too).
* Merge pull request #18948 from kaspth/automatic-collection-cachingRafael Mendonça França2015-02-251-0/+14
|\ | | | | Merge multi_fetch_fragments.
| * Collections automatically cache and fetch partials.Kasper Timm Hansen2015-02-211-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Collections can take advantage of `multi_read` if they render one template and their partials begin with a cache call. The cache call must correspond to either what the collections elements are rendered as, or match the inferred name of the partial. So with a notifications/_notification.html.erb template like: ```ruby <% cache notification %> <%# ... %> <% end %> ``` A collection would be able to use `multi_read` if rendered like: ```ruby <%= render @notifications %> <%= render partial: 'notifications/notification', collection: @notifications, as: :notification %> ```
* | Add nodoc to private constant [ci skip]Rafael Mendonça França2015-02-181-1/+1
| |
* | Improve documentation of local_assignsRafael Mendonça França2015-02-181-7/+13
| |
* | Merge pull request #15700 from maurogeorge/guides-local_assignsRafael Mendonça França2015-02-181-0/+7
|\ \ | |/ |/| | | Add docs about local_assigns on guides
| * Add RDoc about local_assignsMauro George2014-06-131-0/+7
| | | | | | | | [ci skip]
* | Reduce object allocationAkira Matsuda2014-10-251-1/+5
| |
* | Reduce object allocationAkira Matsuda2014-10-251-1/+1
| |
* | Use #tr instead of #gsub where possibleAlex Weidmann2014-10-021-1/+1
| |
* | use tr instead of gsub when possibleAdrian Rangel2014-10-011-1/+1
| |
* | remove useless parameterAaron Patterson2014-08-271-2/+2
| |
* | remove dead codeAaron Patterson2014-08-271-12/+2
|/ | | | | | the ERB has already been compiled to Ruby code by the time we're calling module_eval. Nothing that module eval raises will be caught by a blank `rescue`, so I think we can remove this
* Add variants to Template classŁukasz Strzałkowski2014-03-141-1/+2
|
* Introduce `render :html` for render HTML stringPrem Sichanugrist2014-02-181-0/+1
| | | | | | | | | This is an option for to HTML content with a content type of `text/html`. This rendering option calls `ERB::Util.html_escape` internally to escape unsafe HTML string, so you will have to mark your string as html safe if you have any HTML tag in it. Please see #12374 for more detail.
* Avoid unnecessary catching of Exception instead of StandardError (converting ↵stopdropandrew2013-10-241-2/+2
| | | | Exceptions into StandardErrors)
* Move actionpack/lib/action_view* into actionview/libPiotr Sarnacki2013-06-201-0/+340