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

Conversation

tgxworld
Copy link
Contributor

r? @sgrif

```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
```
…::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
```
@rails-bot
Copy link

warning Warning warning

  • Pull requests are usually filed against the master branch for this repo, but this one is against 5-1-stable. Please double check that you specified the right target!

@tgxworld tgxworld changed the title Backport perf chanages Backport perf changes Sep 27, 2017
@kamipo kamipo merged commit 9e9f4d1 into rails:5-1-stable Oct 22, 2017
@tgxworld tgxworld deleted the backport_perf_chanages branch October 23, 2017 02:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants