From acaf4ff05261cc7560e8dda63e0c92111b6e3b1f Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Fri, 30 Nov 2018 09:53:30 +0800 Subject: [PATCH] Add benchamark --- benchmark/db/schema.rb | 33 ++++++++++++++++++++++++++ benchmark/main.rb | 53 ++++++++++++++++++++++++++++++++++++++++++ goldiloader.gemspec | 1 + 3 files changed, 87 insertions(+) create mode 100644 benchmark/db/schema.rb create mode 100644 benchmark/main.rb diff --git a/benchmark/db/schema.rb b/benchmark/db/schema.rb new file mode 100644 index 0000000..8090cf3 --- /dev/null +++ b/benchmark/db/schema.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +ActiveRecord::Schema.define(version: 0) do + + create_table(:blogs, force: true) do |t| + t.string :name + end + + create_table(:posts, force: true) do |t| + t.string :title + t.integer :blog_id + t.integer :author_id + t.string :owner_type + t.integer :owner_id + end + + create_table(:users, force: true) do |t| + t.string :name + end +end + +class Blog < ActiveRecord::Base + has_many :posts +end + +class Post < ActiveRecord::Base + belongs_to :blog + belongs_to :author, class_name: 'User' +end + +class User < ActiveRecord::Base + has_many :posts, foreign_key: :author_id +end diff --git a/benchmark/main.rb b/benchmark/main.rb new file mode 100644 index 0000000..9a7c020 --- /dev/null +++ b/benchmark/main.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +$LOAD_PATH.push File.expand_path('lib', __dir__) + +require 'benchmark/ips' + +ENV['RAILS_ENV'] = 'test' + +require 'active_record' + +ActiveRecord::Base.establish_connection( + adapter: 'sqlite3', + database: ':memory:' +) + +require_relative './db/schema.rb' + +# Setup data +blog_1 = Blog.create! +blog_2 = Blog.create! +100.times do + user_1 = User.create! + user_2 = User.create! + Post.create!(author: user_1, blog: blog_1) + Post.create!(author: user_2, blog: blog_2) +end + +Benchmark.ips do |x| + x.time = 5 + x.warmup = 2 + + # Use AR's eager loading + x.report('AR eager loading: ') do + ::Blog.all.includes(posts: :author).each do |blog| + blog.posts.each do |post| + post.author.id + end + end + end + + require 'goldiloader' + + # Use goldiloader + x.report('AR with goldiloader: ') do + ::Blog.all.each do |blog| + blog.posts.each do |post| + post.author.id + end + end + end + + x.compare! +end diff --git a/goldiloader.gemspec b/goldiloader.gemspec index a612d48..443e26e 100644 --- a/goldiloader.gemspec +++ b/goldiloader.gemspec @@ -28,6 +28,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'activesupport', '>= 4.2', '< 5.3' spec.add_development_dependency 'appraisal' + spec.add_development_dependency 'benchmark-ips' spec.add_development_dependency 'coveralls' spec.add_development_dependency 'database_cleaner', '>= 1.2' spec.add_development_dependency 'mime-types'