Skip to content

Add quick benchmark #2

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

Open
wants to merge 3 commits into
base: feat/slim-eager-load
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion activerecord/lib/active_record/relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -838,7 +838,14 @@ def self.strict_loading_value

def preload_associations(records) # :nodoc:
preload = preload_values
preload += eager_loading? ? includes_values_non_referenced : includes_values
if ENV["SLIM_PATCH"].present?
preload += eager_loading? ? includes_values_non_referenced : includes_values
elsif ENV["SLIM_PATCH_CODE_ONLY"].present?
includes_values_non_referenced
preload += includes_values unless eager_loading?
else
preload += includes_values unless eager_loading?
end
scope = strict_loading_value ? StrictLoadingScope : nil
preload.each do |associations|
ActiveRecord::Associations::Preloader.new(records: records, associations: associations, scope: scope).call
Expand Down
19 changes: 15 additions & 4 deletions activerecord/lib/active_record/relation/finder_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -408,10 +408,21 @@ def construct_relation_for_exists(conditions)
end

def apply_join_dependency(eager_loading: group_values.empty?, full_eager_loading: false)
selected_includes_values = full_eager_loading ? includes_values : includes_values_referenced
join_dependency = construct_join_dependency(
eager_load_values | selected_includes_values, Arel::Nodes::OuterJoin
)
if ENV["SLIM_PATCH"].present?
selected_includes_values = full_eager_loading ? includes_values : includes_values_referenced
join_dependency = construct_join_dependency(
eager_load_values | selected_includes_values, Arel::Nodes::OuterJoin
)
elsif ENV["SLIM_PATCH_CODE_ONLY"].present?
selected_includes_values = full_eager_loading ? includes_values : includes_values_referenced
join_dependency = construct_join_dependency(
eager_load_values | includes_values, Arel::Nodes::OuterJoin
)
else
join_dependency = construct_join_dependency(
eager_load_values | includes_values, Arel::Nodes::OuterJoin
)
end
relation = except(:includes, :eager_load, :preload).joins!(join_dependency)

if eager_loading && has_limit_or_offset? && !(
Expand Down
96 changes: 96 additions & 0 deletions activerecord/test/cases/associations/performance_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# frozen_string_literal: true

require "cases/helper"
require "cases/encryption/helper"
require "models/author"
require "models/book"
require "models/citation"
require "models/reader"
require "models/post"
require "models/reference"
require "models/comment"
require "models/rating"
require "models/category"
require "models/categorization"
require "models/tag"
require "models/tagging"
require "models/person"
require "models/club"
require "models/developer"
require "models/project"
require "models/computer"
require "models/company"
require "models/contract"
require "models/member"
require "models/membership"
require "models/sponsor"

class AssociationsPerformanceTest < ActiveRecord::TestCase
include ActiveRecord::Encryption::PerformanceHelpers

fixtures :authors, :books, :citations, :readers, :posts, :references, :comments, :ratings,
:categories, :categorizations, :tags, :taggings, :people, :clubs, :members, :memberships,
:sponsors, :developers, :projects, :developers_projects, :computers, :companies, :accounts

DURATION = 10

def test_performance_tree_code_only
baseline = lambda do
ENV["SLIM_PATCH_CODE_ONLY"] = nil
ENV["SLIM_PATCH"] = nil
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_a
end

assert_slower_by_at_most 1.05, baseline: baseline, duration: DURATION do
ENV["SLIM_PATCH_CODE_ONLY"] = "true"
ENV["SLIM_PATCH"] = nil
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_a
end
end

def test_performance_objects_allocating
baseline = lambda do
ENV["SLIM_PATCH_CODE_ONLY"] = nil
ENV["SLIM_PATCH"] = nil
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_a
end

assert_slower_by_at_most 1.2, baseline: baseline, duration: DURATION do
ENV["SLIM_PATCH_CODE_ONLY"] = nil
ENV["SLIM_PATCH"] = "true"
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_a
end
end

def test_performance_sql_only
baseline = lambda do
ENV["SLIM_PATCH_CODE_ONLY"] = nil
ENV["SLIM_PATCH"] = nil
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_sql
end

assert_slower_by_at_most 0.7, baseline: baseline, duration: DURATION do
ENV["SLIM_PATCH_CODE_ONLY"] = nil
ENV["SLIM_PATCH"] = "true"
authors = Author.includes(
:books, { posts: :special_comments }, { categorizations: :category }
).order("comments.body").where("posts.id = 4")
authors.to_sql
end
end
end