Skip to content

Commit

Permalink
Use setup scripts in Active Record benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
bmarkons committed Aug 28, 2017
1 parent 3af45a1 commit d3d0813
Show file tree
Hide file tree
Showing 11 changed files with 23 additions and 175 deletions.
17 changes: 3 additions & 14 deletions rails/benchmarks/bm_activerecord_create_string_columns.rb
Expand Up @@ -2,27 +2,16 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_create_string_columns_setup.rb"

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
ActiveRecord::Migration.verbose = false

COUNT = 25

ActiveRecord::Schema.define do
create_table :users, force: true do |t|
COUNT.times do |i|
t.string :"column#{i}"
end

t.timestamps null: false
end
end

class User < ActiveRecord::Base; end

attributes = {}

COUNT.times do |i|
25.times do |i|
attributes[:"column#{i}"] = "Some string #{i}"
end

Expand Down
10 changes: 2 additions & 8 deletions rails/benchmarks/bm_activerecord_destroy.rb
Expand Up @@ -2,17 +2,11 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_destroy_setup.rb"

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

class User < ActiveRecord::Base; end

attributes = {
Expand Down
21 changes: 2 additions & 19 deletions rails/benchmarks/bm_activerecord_finders_find_by_attributes.rb
Expand Up @@ -2,30 +2,13 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_finders_find_by_attributes_setup.rb"

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

class User < ActiveRecord::Base; end

attributes = {
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar@email.com"
}

1000.times do
User.create!(attributes)
end

User.create!(name: 'kir', email: 'shatrov@me.com')

Benchmark.rails("activerecord/#{db_adapter}_finders_find_by_attributes", time: 5) do
user = User.find_by_email('shatrov@me.com')
str = "name: #{user.name} email: #{user.email}"
Expand Down
19 changes: 2 additions & 17 deletions rails/benchmarks/bm_activerecord_finders_first.rb
Expand Up @@ -2,28 +2,13 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_finders_first_setup.rb"

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

class User < ActiveRecord::Base; end

attributes = {
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar@email.com"
}

1000.times do
User.create!(attributes)
end

Benchmark.rails("activerecord/#{db_adapter}_finders_first", time: 5) do
user = User.first
str = "name: #{user.name} email: #{user.email}"
Expand Down
10 changes: 2 additions & 8 deletions rails/benchmarks/bm_activerecord_save.rb
Expand Up @@ -2,17 +2,11 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_save_setup.rb"

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"
Expand Down
18 changes: 2 additions & 16 deletions rails/benchmarks/bm_activerecord_scope_all.rb
Expand Up @@ -2,28 +2,14 @@
require 'active_record'
require_relative 'support/benchmark_rails'

db_setup script: "bm_scope_all_setup.rb"

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

class User < ActiveRecord::Base; end

attributes = {
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar@email.com"
}

1000.times do
User.create!(attributes)
end

Benchmark.rails("activerecord/#{db_adapter}_scope_all", time: 5) do
str = ""
User.all.each do |user|
Expand Down
25 changes: 2 additions & 23 deletions rails/benchmarks/bm_activerecord_scope_all_with_default_scope.rb
Expand Up @@ -2,36 +2,15 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_with_default_scope_setup.rb"

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.boolean :admin
t.timestamps null: false
end
end

class User < ActiveRecord::Base
default_scope { where(admin: true) }
end

admin = true

1000.times do
attributes = {
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar@email.com",
admin: admin
}

User.create!(attributes)

admin = !admin
end

Benchmark.rails("activerecord/#{db_adapter}_scope_all_with_default_scope", time: 5) do
str = ""
User.all.each do |user|
Expand Down
19 changes: 2 additions & 17 deletions rails/benchmarks/bm_activerecord_scope_where.rb
Expand Up @@ -2,28 +2,13 @@
require 'active_record'
require_relative 'support/benchmark_rails'

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_scope_where_setup.rb"

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

add_index :users, :email, unique: true
end

class User < ActiveRecord::Base; end

1000.times do |i|
User.create!({
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar#{"%03d" % i}@email.com"
})
end

Benchmark.rails("activerecord/#{db_adapter}_scope_where", time: 5) do
str = ""
User
Expand Down
15 changes: 2 additions & 13 deletions rails/benchmarks/bm_activerecord_validations_invalid.rb
Expand Up @@ -2,22 +2,11 @@
require 'active_record'
require_relative 'support/benchmark_rails'

db_setup script: "bm_validations_invalid_setup.rb"

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
ActiveRecord::Migration.verbose = false

ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
t.string :title
t.string :author
t.text :body
t.integer :sequence
t.integer :age
t.string :subdomain
t.string :legacy_code
t.string :size
end
end

class Post < ActiveRecord::Base
validates :title, presence: true, confirmation: true
validates :sequence, uniqueness: true
Expand Down
25 changes: 2 additions & 23 deletions rails/benchmarks/bm_activerecord_validations_valid.rb
Expand Up @@ -2,22 +2,11 @@
require 'active_record'
require_relative 'support/benchmark_rails'

db_setup script: "bm_validations_valid_setup.rb"

ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
ActiveRecord::Migration.verbose = false

ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
t.string :title
t.string :author
t.text :body
t.integer :sequence
t.integer :age
t.string :subdomain
t.string :legacy_code
t.string :size
end
end

class Post < ActiveRecord::Base
validates :title, presence: true, confirmation: true
validates :sequence, uniqueness: true
Expand All @@ -30,16 +19,6 @@ class Post < ActiveRecord::Base
message: "%{value} is not a valid size" }
end

Post.create!({
title: 'RubyBench',
author: 'RubyBench',
age: 21,
sequence: 90,
subdomain: 'ru',
legacy_code: 'letters',
size: 'small'
})

post = Post.new({
title: 'RubyBench',
author: 'RubyBench',
Expand Down
19 changes: 2 additions & 17 deletions sequel/benchmarks/bm_sequel_scope_all.rb
Expand Up @@ -2,29 +2,14 @@
require 'sequel'
require_relative 'support/benchmark_sequel'

DB = Sequel.connect(ENV.fetch('DATABASE_URL'))
db_setup script: "bm_scope_all_setup.rb"

DB.create_table!(:users) do
primary_key :id
String :name, size: 255
String :email, size: 255
DateTime :created_at, null: false
DateTime :updated_at, null: false
end
Sequel.connect(ENV.fetch('DATABASE_URL'))

class User < Sequel::Model
plugin :timestamps, update_on_create: true
end

attributes = {
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
email: "foobar@email.com"
}

1000.times do
User.create(attributes)
end

Benchmark.sequel("sequel/#{db_adapter}_scope_all", time: 5) do
str = ""
User.all.each do |user|
Expand Down

2 comments on commit d3d0813

@tgxworld
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I think it is fine to duplicated all of these. The reason why I would prefer the scripts to be verbose is because the full script is displayed on the rubybench.org when we view a benchmark. It is hard for someone else to figure out what bm_save_setup does when viewing on rubybench.org.

@bmarkons
Copy link
Contributor

@bmarkons bmarkons commented on d3d0813 Sep 5, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this change, I wanted to make sure we are doing the same setup for Sequel and Active Record benchmarks, to make correct and fair comparison.

We could display both setup script used and benchmark script one next to another? Having separated setup is much more error prone, since one is written using Sequel while the other one using Active Record.

I understand it's important to have setup displayed but we simply need to make UI follow this change.
Sam also recommended this change here in #88 (comment)

Please sign in to comment.