Skip to content

Instantly share code, notes, and snippets.

@bogdan
Created July 24, 2026 08:09
Show Gist options
  • Select an option

  • Save bogdan/cef815f4c79e083ccc1fd2310de98d53 to your computer and use it in GitHub Desktop.

Select an option

Save bogdan/cef815f4c79e083ccc1fd2310de98d53 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require_relative "../config/environment"
def rss_kb
`ps -o rss= -p #{Process.pid}`.to_i
end
$measure_depth = 0
def measure(label)
indent = " " * $measure_depth
GC.start
rss_before = rss_kb
objects_before = GC.stat(:total_allocated_objects)
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
$measure_depth += 1
yield
ensure
$measure_depth -= 1
time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at
objects_after = GC.stat(:total_allocated_objects)
rss_after = rss_kb
puts format(
"%-34s %8.2fms rss %6dKB -> %6dKB (%+dKB) objects +%d",
indent + label, time * 1000, rss_before, rss_after, rss_after - rss_before,
objects_after - objects_before
)
end
t = Token.limit(5); t.load
t.preload(:meeting).load
t.preload(:meeting, :utterance).load
puts "=== Relation#preload (spawns a new relation, re-queries tokens each time) ==="
measure("total") do
ActiveRecord::Base.cache do
t = nil
measure("Token.limit(5).load") { t = Token.limit(5); t.load }
measure("preload(:meeting)") { t.preload(:meeting).load }
measure("preload(:meeting, :utterance)") { t.preload(:meeting, :utterance).load }
nil
end
end
puts
puts "=== ActiveRecord::Associations::Preloader (preloads onto the same records) ==="
measure("total") do
ActiveRecord::Base.cache do
t = nil
measure("Token.limit(5).load") { t = Token.limit(5).load }
measure("Preloader(:meeting)") do
ActiveRecord::Associations::Preloader.new(records: t, associations: :meeting).call
end
measure("Preloader(:meeting, :utterance)") do
ActiveRecord::Associations::Preloader.new(records: t, associations: [ :meeting, :utterance ]).call
end
nil
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment