Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport perf changes #30727

Merged
merged 2 commits into from
Oct 22, 2017
Merged

Commits on Sep 27, 2017

  1. PERF: Recover ActiveRecord::pluck performance.

    ```ruby
    require 'active_record'
    require 'benchmark/ips'
    
    ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
    ActiveRecord::Migration.verbose = false
    
    ActiveRecord::Schema.define do
      create_table :users, force: true do |t|
        t.string :name, :email
        t.timestamps null: false
      end
    end
    
    attributes = {
      name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
      email: 'foobar@email.com'
    }
    
    class User < ActiveRecord::Base; end
    
    1000.times do
      User.create!(attributes)
    end
    
    Benchmark.ips do |x|
      x.config(time: 10, warmup: 2)
    
      x.report('pluck 1 column') do
        User.pluck(:id)
      end
    
      x.report('pluck 2 columns') do
        User.pluck(:id, :email)
      end
    
      x.report('pluck 1 column with scope') do
        User.where(id: 1000).pluck(:id)
      end
    
      x.report('pluck 2 columns with scope') do
        User.where(id: 1000).pluck(:id, :email)
      end
    end
    ```
    
    ```
    Calculating -------------------------------------
          pluck 1 column   122.000  i/100ms
         pluck 2 columns    74.000  i/100ms
    pluck 1 column with scope
                           615.000  i/100ms
    pluck 2 columns with scope
                           515.000  i/100ms
    -------------------------------------------------
          pluck 1 column      1.272k (± 3.9%) i/s -     12.810k
         pluck 2 columns    750.096  (± 3.3%) i/s -      7.548k
    pluck 1 column with scope
                              6.074k (± 4.1%) i/s -     60.885k
    pluck 2 columns with scope
                              5.158k (± 2.7%) i/s -     52.015k
    ```
    
    ```
    Calculating -------------------------------------
          pluck 1 column   126.000  i/100ms
         pluck 2 columns    78.000  i/100ms
    pluck 1 column with scope
                           457.000  i/100ms
    pluck 2 columns with scope
                           434.000  i/100ms
    -------------------------------------------------
          pluck 1 column      1.266k (± 2.1%) i/s -     12.726k
         pluck 2 columns    795.061  (± 3.0%) i/s -      7.956k
    pluck 1 column with scope
                              4.660k (± 2.1%) i/s -     46.614k
    pluck 2 columns with scope
                              4.355k (± 2.3%) i/s -     43.834k
    ```
    
    ```
    Calculating -------------------------------------
          pluck 1 column   126.000  i/100ms
         pluck 2 columns    78.000  i/100ms
    pluck 1 column with scope
                           539.000  i/100ms
    pluck 2 columns with scope
                           481.000  i/100ms
    -------------------------------------------------
          pluck 1 column      1.308k (± 3.4%) i/s -     13.104k
         pluck 2 columns    798.604  (± 2.8%) i/s -      8.034k
    pluck 1 column with scope
                              5.530k (± 3.4%) i/s -     55.517k
    pluck 2 columns with scope
                              4.914k (± 2.7%) i/s -     49.543k
    ```
    
    ```
    Calculating -------------------------------------
          pluck 1 column   139.000  i/100ms
         pluck 2 columns    79.000  i/100ms
    pluck 1 column with scope
                           580.000  i/100ms
    pluck 2 columns with scope
                           526.000  i/100ms
    -------------------------------------------------
          pluck 1 column      1.337k (± 3.0%) i/s -     13.483k
         pluck 2 columns    806.776  (± 2.7%) i/s -      8.137k
    pluck 1 column with scope
                              5.924k (± 4.1%) i/s -     59.160k
    pluck 2 columns with scope
                              5.276k (± 3.1%) i/s -     53.126k
    ```
    tgxworld committed Sep 27, 2017
    Configuration menu
    Copy the full SHA
    df71234 View commit details
    Browse the repository at this point in the history
  2. PERF: Incorrect memoization in `ActiveRecord::Associations::Preloader…

    …::Association`.
    
    ```
    require 'active_record'
    require 'benchmark/ips'
    
    ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
    ActiveRecord::Migration.verbose = false
    
    ActiveRecord::Schema.define do
      create_table :users, force: true do |t|
        t.string :name, :email
        t.integer :topic_id
        t.timestamps null: false
      end
    
      create_table :topics, force: true do |t|
        t.string :title
        t.timestamps null: false
      end
    end
    
    attributes = {
      name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
      email: 'foobar@email.com'
    }
    
    class Topic < ActiveRecord::Base
      has_many :users
    end
    
    class User < ActiveRecord::Base
      belongs_to :topic
    end
    
    100.times do
      User.create!(attributes)
    end
    
    users = User.first(50)
    
    100.times do
      Topic.create!(title: 'This is a topic', users: users)
    end
    
    Benchmark.ips do |x|
      x.config(time: 10, warmup: 5)
    
      x.report("preload") do
        User.includes(:topic).all.to_a
      end
    end
    ```
    
    ```
    Calculating -------------------------------------
                 preload    25.000  i/100ms
    -------------------------------------------------
                 preload    251.772  (± 1.2%) i/s -      2.525k
    ```
    
    ```
    Calculating -------------------------------------
                 preload    26.000  i/100ms
    -------------------------------------------------
                 preload    270.392  (± 1.1%) i/s -      2.704k
    ```
    tgxworld committed Sep 27, 2017
    Configuration menu
    Copy the full SHA
    13364a8 View commit details
    Browse the repository at this point in the history