84 lines
1.7 KiB
Ruby
Executable File
84 lines
1.7 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
require "forwardable"
|
|
require "colorator"
|
|
require "liquid"
|
|
require "benchmark/ips"
|
|
require "memory_profiler"
|
|
|
|
# Set up (memory) profiler
|
|
|
|
class Profiler
|
|
def self.run
|
|
yield new(ARGV[0] || 10_000)
|
|
end
|
|
|
|
def initialize(count)
|
|
@count = count.to_i
|
|
end
|
|
|
|
def report(label, color, &block)
|
|
prof_report = MemoryProfiler.report { @count.to_i.times(&block) }
|
|
|
|
allocated_memory = prof_report.scale_bytes(prof_report.total_allocated_memsize)
|
|
allocated_objects = prof_report.total_allocated
|
|
retained_memory = prof_report.scale_bytes(prof_report.total_retained_memsize)
|
|
retained_objects = prof_report.total_retained
|
|
|
|
puts <<~MSG.send(color)
|
|
With #{label} calls
|
|
|
|
Total allocated: #{allocated_memory} (#{allocated_objects} objects)
|
|
Total retained: #{retained_memory} (#{retained_objects} objects)
|
|
MSG
|
|
end
|
|
end
|
|
|
|
# Set up stage
|
|
|
|
class Drop < Liquid::Drop
|
|
def initialize(obj)
|
|
@obj = obj
|
|
end
|
|
end
|
|
|
|
class ForwardDrop < Drop
|
|
extend Forwardable
|
|
def_delegators :@obj, :name
|
|
end
|
|
|
|
class StaticDrop < Drop
|
|
def name
|
|
@obj.name
|
|
end
|
|
end
|
|
|
|
class Document
|
|
def name
|
|
"lipsum"
|
|
end
|
|
end
|
|
|
|
# Set up actors
|
|
|
|
document = Document.new
|
|
alpha = ForwardDrop.new(document)
|
|
beta = StaticDrop.new(document)
|
|
count = ARGV[0] || 10_000
|
|
|
|
# Run profilers
|
|
puts "\nMemory profiles for #{count} calls to invoke drop key:"
|
|
Profiler.run do |x|
|
|
x.report("forwarded", :cyan) { alpha["name"] }
|
|
x.report("static", :green) { beta["name"] }
|
|
end
|
|
|
|
# Benchmark
|
|
puts "\nBenchmarking the two scenarios..."
|
|
Benchmark.ips do |x|
|
|
x.report("forwarded".cyan) { alpha["name"] }
|
|
x.report("static".green) { beta["name"] }
|
|
x.compare!
|
|
end
|