Skip to content

Instantly share code, notes, and snippets.

View alekseyl's full-sized avatar
👨‍💻

Aleksey Leshchuk alekseyl

👨‍💻
View GitHub Profile
@alekseyl
alekseyl / nested_select_profiling.rb
Last active January 12, 2025 19:58
nested_select_profiling
# This is a simple gist for performance and RAM usage testing for a nested_select gem
#
# Objects relations: course -> topics -> lessons ( all relations are has_many )
#
# -------------------------------------------------------------------------
# Schemas:
#
# create_table "lessons", force: :cascade do |t|
# t.string "title", null: false, comment: "Тема урока"
# t.string "description", null: false, comment: "Описание урока"
@alekseyl
alekseyl / compare_ram.rb
Created May 4, 2025 14:11
Memory profiling method comparing eager_load VS preload aproaches
require 'memory_profiler'
require 'terminal-table'
def compare_ram(scope, base_collection_size, nesting)
ids = scope.ids
ids_sample = ids.sample(base_collection_size) # it should be the same id for both tests, since we comparing memory consumption
# just to keep from memory profiler objects oblivion, and get retain numbers correctly
el, pr = []
preload = MemoryProfiler.report do
@alekseyl
alekseyl / compare_cpu.rb
Last active May 11, 2025 12:37
CPU profiling method comparing eager_load VS preload aproaches
def compare_cpu_general( scope, base_collection_size, nesting)
ids = scope.ids
ActiveRecord::Base.logger.silence do
Benchmark.bmbm do |benchmark|
benchmark.report("eager_load") do
50.times do
# sample(base_collection_size + 1) and limit(base_collection_size)
# added to imitate real limit for eager_load, so it would be obligated to use 2 queries instead of one
# for more read here: https://medium.com/p/5ce11870de62
scope.where(id: ids.sample(base_collection_size + 1)).limit(base_collection_size).eager_load(nesting).load