1. 17 1月, 2019 2 次提交
  2. 04 10月, 2018 1 次提交
  3. 02 10月, 2018 1 次提交
  4. 01 10月, 2018 2 次提交
  5. 29 9月, 2018 1 次提交
    • Y
      Add `Style/RedundantFreeze` to remove redudant `.freeze` · aa3dcabd
      Yasuo Honda 提交于
      Since Rails 6.0 will support Ruby 2.4.1 or higher
      `# frozen_string_literal: true` magic comment is enough to make string object frozen.
      This magic comment is enabled by `Style/FrozenStringLiteralComment` cop.
      
      * Exclude these files not to auto correct false positive `Regexp#freeze`
       - 'actionpack/lib/action_dispatch/journey/router/utils.rb'
       - 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb'
      
      It has been fixed by https://github.com/rubocop-hq/rubocop/pull/6333
      Once the newer version of RuboCop released and available at Code Climate these exclude entries should be removed.
      
      * Replace `String#freeze` with `String#-@` manually if explicit frozen string objects are required
      
       - 'actionpack/test/controller/test_case_test.rb'
       - 'activemodel/test/cases/type/string_test.rb'
       - 'activesupport/lib/active_support/core_ext/string/strip.rb'
       - 'activesupport/test/core_ext/string_ext_test.rb'
       - 'railties/test/generators/actions_test.rb'
      aa3dcabd
  6. 23 9月, 2018 1 次提交
    • Y
      Enable `Performance/UnfreezeString` cop · 1b86d901
      yuuji.yaginuma 提交于
      In Ruby 2.3 or later, `String#+@` is available and `+@` is faster than `dup`.
      
      ```ruby
      # frozen_string_literal: true
      
      require "bundler/inline"
      
      gemfile(true) do
        source "https://rubygems.org"
      
        gem "benchmark-ips"
      end
      
      Benchmark.ips do |x|
        x.report('+@') { +"" }
        x.report('dup') { "".dup }
        x.compare!
      end
      ```
      
      ```
      $ ruby -v benchmark.rb
      ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
      Warming up --------------------------------------
                        +@   282.289k i/100ms
                       dup   187.638k i/100ms
      Calculating -------------------------------------
                        +@      6.775M (± 3.6%) i/s -     33.875M in   5.006253s
                       dup      3.320M (± 2.2%) i/s -     16.700M in   5.032125s
      
      Comparison:
                        +@:  6775299.3 i/s
                       dup:  3320400.7 i/s - 2.04x  slower
      
      ```
      1b86d901
  7. 03 4月, 2018 2 次提交
    • B
      Use `:default` option in order to set default value of `finalize_compiled_template_methods` · e6f3882c
      bogdanvlviv 提交于
      Since we introduced default option for `class_attribute` and
      `mattr_accessor` family of methods and changed all occurrences of setting
      default values by using of `:default` option I think it would be fine to use
      `:default` option in order to set default value of `finalize_compiled_template_methods`
      since it expresses itself very well.
      
      Related to #29294, #32418
      e6f3882c
    • S
      Add `action_view.finalize_compiled_template_methods` config option · eede8d81
      Simon Coffey 提交于
      ActionView::Template instances compile their source to methods on the
      ActionView::CompiledTemplates module. To prevent leaks in development
      mode, where templates can frequently change, a finalizer is added that
      undefines these methods[1] when the templates are garbage-collected.
      
      This is undesirable in the test environment, however, as templates don't
      change during the life of the test. Moreover, the cost of undefining a
      method is proportional to the number of descendants a class or module
      has, since the method cache must be cleared for all descendant classes.
      
      As ActionView::CompiledTemplates is mixed into every
      ActionView::TestCase (or in RSpec suites, every view spec example
      group), it can end up with a very large number of descendants, and
      undefining its methods can become very expensive.
      
      In large test suites, this results in a long delay at the end of the
      test suite as all template finalizers are run, only for the process to
      then exit.
      
      To avoid this unnecessary cost, this change adds a config option,
      `action_view.finalize_compiled_template_methods`, defaulting to true,
      and sets it to false in the test environment only.
      
      [1] https://github.com/rails/rails/blob/09b2348f7fc8d4e7191e70e06608c5909067e2aa/actionview/lib/action_view/template.rb#L118-L126
      eede8d81
  8. 02 9月, 2017 1 次提交
  9. 01 9月, 2017 1 次提交
  10. 11 7月, 2017 1 次提交
  11. 07 7月, 2017 1 次提交
  12. 02 7月, 2017 1 次提交
  13. 01 7月, 2017 1 次提交
  14. 20 6月, 2017 2 次提交
  15. 19 2月, 2017 1 次提交
  16. 15 1月, 2017 1 次提交
    • A
      Allow render locals to be assigned to instance variables · b5edc55d
      Andrew White 提交于
      In #26672 we blocked use of Ruby keywords as identifiers for view
      locals but inadvertently broke the use of instance variable names
      as identifiers. Whilst not explicitly documented this behavior has
      been around for a long time and there's no need to break it now.
      
      Fixes #27480.
      b5edc55d
  17. 28 12月, 2016 1 次提交
  18. 24 12月, 2016 2 次提交
  19. 09 12月, 2016 2 次提交
  20. 29 10月, 2016 1 次提交
  21. 27 10月, 2016 1 次提交
  22. 02 10月, 2016 1 次提交
    • P
      Change render to support any hash keys in locals · f9960f2d
      Peter Schilling 提交于
      this lets you pass ruby keywords to templates:
      
          <%= render 'example', class: "cool" %>
      
          <%= render 'example', "spaces are" => "a-ok" %>
      
          <%= render 'example', Foo: "bar" %>
      
      Previously you'd see confusing syntax errors like this:
      
          SyntaxError (.../_example.html.erb:1: syntax error, unexpected '='
      
      Now you can reference invalid identifiers through local_assigns.
      
      If you try to use an invalid keyword (e.g. class) in your template, you
      get a syntax error on the line where you use it.
      f9960f2d
  23. 25 8月, 2016 2 次提交
    • A
      kick different instrumentation method · 804f5b3c
      Aaron Patterson 提交于
      We can eliminate a conditional by calling a different instrumentation
      method depending on the situation.  In this case, we'll call the special
      case "!render_template" instrumentation method and eliminate the case /
      when clause from the `instrument` method.
      804f5b3c
    • A
      remove useless freeze · c1049403
      Aaron Patterson 提交于
      Ruby already does this freeze for us.
      c1049403
  24. 08 8月, 2016 1 次提交
    • X
      code gardening: removes redundant selfs · a9dc4545
      Xavier Noria 提交于
      A few have been left for aesthetic reasons, but have made a pass
      and removed most of them.
      
      Note that if the method `foo` returns an array, `foo << 1`
      is a regular push, nothing to do with assignments, so
      no self required.
      a9dc4545
  25. 07 8月, 2016 1 次提交
  26. 20 2月, 2016 1 次提交
    • K
      Make collection caching explicit. · b4558c10
      Kasper Timm Hansen 提交于
      Having collection caching that wraps templates and automatically tries
      to infer if they are cachable proved to be too much of a hassle.
      
      We'd rather have it be something you explicitly turn on.
      
      This removes much of the code and docs to explain the previous automatic
      behavior.
      
      This change also removes scoped cache keys and passing cache_options.
      b4558c10
  27. 03 11月, 2015 1 次提交
  28. 03 9月, 2015 1 次提交
  29. 30 7月, 2015 1 次提交
    • S
      Cut string ActionView template allocations · 9b189a31
      schneems 提交于
      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.
      9b189a31
  30. 20 7月, 2015 1 次提交
    • S
      Freeze string literals when not mutated. · 5bb1d4d2
      schneems 提交于
      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)
      5bb1d4d2
  31. 08 7月, 2015 1 次提交
    • D
      Support explicit defintion of resouce name for collection caching. · 5a41d004
      Dov Murik 提交于
      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).
      5a41d004
  32. 21 2月, 2015 1 次提交
    • K
      Collections automatically cache and fetch partials. · 11644fd0
      Kasper Timm Hansen 提交于
      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 %>
      ```
      11644fd0
  33. 19 2月, 2015 1 次提交