Permalink
Commits on Sep 29, 2014
  1. fixes typo in AS CHANGELOG [ci skip]

    fxn committed Sep 29, 2014
    References f92ac24.
  2. Merge pull request #17107 from kaspth/parse-html-as-fragments

    rafaelfranca committed Sep 29, 2014
    Parse HTML as document fragment.
  3. Parse HTML as document fragment.

    kaspth committed Sep 29, 2014
    This is to match the changes in Rails Dom Testing rails/rails-dom-testing#20.
  4. Merge pull request #17093 from phiggins/remove-dynamic-send-on-built-…

    tenderlove committed Sep 29, 2014
    …in-callbacks
    
    Reduce allocations when running AR callbacks.
  5. Merge pull request #17099 from sferik/each_key

    rafaelfranca committed Sep 29, 2014
    Use Hash#each_key instead of Hash#keys.each
  6. Merge pull request #17086 from seuros/master

    rafaelfranca committed Sep 29, 2014
    correct filename for jobs tests
  7. Use Hash#each_key instead of Hash#keys.each

    sferik committed Sep 29, 2014
    Hash#keys.each allocates an array of keys; Hash#each_key iterates through the
    keys without allocating a new array. This is the reason why Hash#each_key
    exists.
  8. Merge pull request #17092 from Empact/defunct-ivars

    rafaelfranca committed Sep 29, 2014
    Remove defunct ivars
  9. Remove defunct ivars

    Empact committed Sep 25, 2014
    @column_names_with_alias, @dynamic_methods_hash, @time_zone_column_names, and @cached_time_zone
Commits on Sep 28, 2014
  1. Reduce allocations when running AR callbacks.

    phiggins committed Sep 28, 2014
    Inspired by @tenderlove's work in
    c363fff, this reduces the number of
    strings allocated when running callbacks for ActiveRecord instances. I
    measured that using this script:
    
    ```
    require 'objspace'
    require 'active_record'
    require 'allocation_tracer'
    
    ActiveRecord::Base.establish_connection adapter: "sqlite3",
                                            database: ":memory:"
    
    ActiveRecord::Base.connection.instance_eval do
      create_table(:articles) { |t| t.string :name }
    end
    
    class Article < ActiveRecord::Base; end
    a = Article.create name: "foo"
    a = Article.find a.id
    
    N = 10
    result = ObjectSpace::AllocationTracer.trace do
      N.times { Article.find a.id }
    end
    
    result.sort.each do |k,v|
      p k => v
    end
    puts "total: #{result.values.map(&:first).inject(:+)}"
    ```
    
    When I run this against master and this branch I get this output:
    
    ```
    pete@balloon:~/projects/rails/activerecord$ git checkout master
    M Gemfile
    Switched to branch 'master'
    pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_before
    pete@balloon:~/projects/rails/activerecord$ git checkout remove-dynamic-send-on-built-in-callbacks
    M Gemfile
    Switched to branch 'remove-dynamic-send-on-built-in-callbacks'
    pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_after
    pete@balloon:~/projects/rails/activerecord$ diff allocations_before allocations_after
    39d38
    <
    {["/home/pete/projects/rails/activesupport/lib/active_support/callbacks.rb",
    81]=>[40, 0, 0, 0, 0, 0]}
    42c41
    < total: 630
    ---
    > total: 590
    
    ```
    
    In addition to this, there are two micro-optimizations present:
    
    * Using `block.call if block` vs `yield if block_given?` when the block was being captured already.
    
    ```
    pete@balloon:~/projects$ cat benchmark_block_call_vs_yield.rb
    require 'benchmark/ips'
    
    def block_capture_with_yield &block
      yield if block_given?
    end
    
    def block_capture_with_call &block
      block.call if block
    end
    
    def no_block_capture
      yield if block_given?
    end
    
    Benchmark.ips do |b|
      b.report("block_capture_with_yield") { block_capture_with_yield }
      b.report("block_capture_with_call") { block_capture_with_call }
      b.report("no_block_capture") { no_block_capture }
    end
    pete@balloon:~/projects$ ruby benchmark_block_call_vs_yield.rb
    Calculating -------------------------------------
    block_capture_with_yield
                            124979 i/100ms
    block_capture_with_call
                            138340 i/100ms
        no_block_capture    136827 i/100ms
    -------------------------------------------------
    block_capture_with_yield
                          5703108.9 (±2.4%) i/s -   28495212 in   4.999368s
    block_capture_with_call
                          6840730.5 (±3.6%) i/s -   34169980 in   5.002649s
        no_block_capture  5821141.4 (±2.8%) i/s -   29144151 in   5.010580s
    ```
    
    * Defining and calling methods instead of using send.
    
    ```
    pete@balloon:~/projects$ cat benchmark_method_call_vs_send.rb
    require 'benchmark/ips'
    
    class Foo
      def tacos
        nil
      end
    end
    
    my_foo = Foo.new
    
    Benchmark.ips do |b|
      b.report('send') { my_foo.send('tacos') }
      b.report('call') { my_foo.tacos }
    end
    pete@balloon:~/projects$ ruby benchmark_method_call_vs_send.rb
    Calculating -------------------------------------
                    send     97736 i/100ms
                    call    151142 i/100ms
    -------------------------------------------------
                    send  2683730.3 (±2.8%) i/s -   13487568 in   5.029763s
                    call  8005963.9 (±2.7%) i/s -   40052630 in   5.006604s
    ```
    
    The result of this is making typical ActiveRecord operations slightly faster:
    
    https://gist.github.com/phiggins/e46e51dcc7edb45b5f98
  2. Merge pull request #17087 from taboularasa/master

    robin850 committed Sep 28, 2014
    technical correction in guides under 'Generating an engine' [ci skip]
  3. technical correction in guides under 'Generating an engine'

    David Elliott
    David Elliott committed Sep 28, 2014
    `bin/rails` would not exist outside of a rails project
  4. Merge pull request #17077 from schneems/schneems/backtrace-string-all…

    jeremy committed Sep 28, 2014
    …ocations
    
    Decrease backtrace cleaner object allocations
Commits on Sep 27, 2014
  1. Tiny follow-up to #16999 [ci skip]

    robin850 committed Sep 27, 2014
    * Fix a typo
    * Remove references to Rails version
    * Remove an extra whitespace
  2. Make AJ integration tests much less verbose

    matthewd committed Sep 27, 2014
    In passing, avoid a blind retry in QC: instead, just fix the problem.
  3. Merge pull request #17082 from prathamesh-sonpatki/fix-typo-in-upgrad…

    seuros committed Sep 27, 2014
    …ing-guide
    
    Fix typo in upgrading guide
  4. Fix typo in upgrading guide

    prathamesh-sonpatki committed Sep 27, 2014
    - [ci skip]
    - behvaior -> behavior
  5. Merge pull request #17081 from prathamesh-sonpatki/fix-aj-typos

    seuros committed Sep 27, 2014
    Fix some typos in ActiveJob
  6. Fix some typos in ActiveJob

    prathamesh-sonpatki committed Sep 27, 2014
    [ci skip]
  7. Merge pull request #17080 from prathamesh-sonpatki/fix-typo-in-ar-cha…

    seuros committed Sep 27, 2014
    …ngelog
    
    Fix typo in AR changelog [ci skip]
  8. Fix typo in AR changelog

    prathamesh-sonpatki committed Sep 27, 2014
    - middlware -> middleware
  9. some object allocation reduction for new AR objects

    tenderlove committed Sep 27, 2014
    Benchmark:
    
    ```ruby
    require 'objspace'
    require 'active_record'
    
    ActiveRecord::Base.establish_connection adapter: "sqlite3",
                                            database: ":memory:"
    
    ActiveRecord::Base.connection.instance_eval do
      create_table(:articles) { |t| t.string :name }
    end
    
    class Article < ActiveRecord::Base; end
    a = Article.create name: "foo"
    a = Article.find a.id
    
    N = 10
    ObjectSpace::AllocationTracer.trace do
      N.times { Article.find a.id }
    end
    ObjectSpace::AllocationTracer.allocated_count_table
    table.sort_by { |_,x| x }.each do |k,v|
      p k => (v / N)
    end
    ```
  10. Merge pull request #17079 from y-yagi/patch-1

    zzak committed Sep 27, 2014
    [ci skip] fix typo in set examples
  11. Move object allocation out of loop

    Richard Schneeman Richard Schneeman
    Richard Schneeman authored and Richard Schneeman committed Sep 27, 2014
    Right now BenchmarkCleaner allocates hundreds of strings on every request with an exception. This patch moves those strings to be generated at boot once and re-used.
    
    ## Bench Methods
    
    I took a modified form of CodeTriage https://github.com/schneems/codetriage-ko1-test-app/blob/master/perf.rake and ran given rake tasks with and without the patch to BacktraceCleaner.
    
    I made an endpoint results in exception
    
    ```
      def index
        raise “foo"
      end
    ```
    
    The gem `memory_profiler` was used to capture objects allocated for a single request. Then `benchmark/ips` was used to test the speed of the patch.
    
    You will see that we use less objects and the code becomes measurably faster with this patch.
    
    ## With patch:
    
    Memory for one request:
    
    ```
    Total allocated 7441
    Total retained 37
    ```
    
    Requests per second:
    
    
    ```
    Calculating -------------------------------------
                     ips         4 i/100ms
    -------------------------------------------------
                     ips       43.0 (±4.7%) i/s -        216 in   5.037733s
    ```
    
    
    ## Without patch:
    
    Memory used for one request:
    
    
    ```
    Total allocated 11599
    Total retained 35 
    ```
    
    Requests per second:
    
    ```
    Calculating -------------------------------------
                     ips         3 i/100ms
    -------------------------------------------------
                     ips       39.4 (±7.6%) i/s -        198 in   5.052783s
    ```
    
    ## Analysis
    
    The patch is faster:
    
    ```
    (43.0 - 39.4 ) / 39.4 * 100
    # => 9 # % ~ speed bump
    ```
    
    It also allocates less objects:
    
    ```
    11599 - 7441
    # => 4158
    ```
    
    These strings are allocated on __EVERY SINGLE REQUEST__. This patch saves us 4158 objects __PER REQUEST__ with exception.
    
    Faster errors == Faster applications
  12. Merge pull request #17076 from yuki24/write-doc-for-rescue-responses

    zzak committed Sep 27, 2014
    Add documentation about rescue_responses in Configuring [ci skip]
Commits on Sep 26, 2014
  1. Merge pull request #17071 from claudiob/don-t-require-action-dispatch…

    rafaelfranca committed Sep 26, 2014
    …-twice
    
    Don’t require already required modules
  2. Don’t require already required modules

    claudiofullscreen
    claudiofullscreen committed Sep 26, 2014
    abstract_unit.rb requires `action_controller` which [already includes the following lines of code](https://github.com/rails/rails/blob/64fcdce1d3a6a8768ab17f3be144270456814f82/actionpack/lib/action_controller.rb#L2L3):
    
    ```ruby
    require 'abstract_controller'
    require 'action_dispatch'
    ```
  3. Merge pull request #17070 from felipecvo/master

    rafaelfranca committed Sep 26, 2014
    Add +variants to ActionView::FileSystemResolver documentation.
Commits on Sep 25, 2014
  1. Revert "Merge pull request #16966 from why-el/symbolize-path-params"

    rafaelfranca committed Sep 25, 2014
    This reverts commit 9d05d6d, reversing
    changes made to 0863c92.
    
    The change in the behaviour reported at #16958 doesn't exist since 4.0
    and 4.1 works in the same way