Add a CI job to profile memory usage of commit

This commit is contained in:
Ashwin Maroli
2019-05-17 22:47:05 +05:30
parent b3b63a683f
commit ab698191b9
3 changed files with 56 additions and 16 deletions
+5 -2
View File
@@ -6,18 +6,21 @@ rvm:
- 2.3 - 2.3
- 2.4 - 2.4
- 2.5 - 2.5
- &latest_ruby 2.6
- ruby-head - ruby-head
- jruby-head - jruby-head
# - rbx-2 # - rbx-2
sudo: false
addons: addons:
apt: apt:
packages: packages:
- libgmp3-dev - libgmp3-dev
matrix: matrix:
include:
- rvm: *latest_ruby
script: bundle exec rake memory_profile:run
name: Profiling Memory Usage
allow_failures: allow_failures:
- rvm: ruby-head - rvm: ruby-head
- rvm: jruby-head - rvm: jruby-head
+1
View File
@@ -8,6 +8,7 @@ gemspec
group :benchmark, :test do group :benchmark, :test do
gem 'benchmark-ips' gem 'benchmark-ips'
gem 'memory_profiler' gem 'memory_profiler'
gem 'terminal-table'
install_if -> { RUBY_PLATFORM !~ /mingw|mswin|java/ } do install_if -> { RUBY_PLATFORM !~ /mingw|mswin|java/ } do
gem 'stackprof' gem 'stackprof'
+50 -14
View File
@@ -2,25 +2,61 @@
require 'benchmark/ips' require 'benchmark/ips'
require 'memory_profiler' require 'memory_profiler'
require 'terminal-table'
require_relative 'theme_runner' require_relative 'theme_runner'
def profile(phase, &block) class Profiler
puts LOG_LABEL = "Profiling: ".rjust(14).freeze
puts "#{phase}:" REPORTS_DIR = File.expand_path('.memprof', __dir__).freeze
puts
report = MemoryProfiler.report(&block) def self.run
puts
yield new
end
report.pretty_print( def initialize
color_output: true, @allocated = []
scale_bytes: true, @retained = []
detailed_report: true @headings = []
) end
def profile(phase, &block)
print LOG_LABEL
print "#{phase}.. ".ljust(10)
report = MemoryProfiler.report(&block)
puts 'Done.'
@headings << phase.capitalize
@allocated << "#{report.scale_bytes(report.total_allocated_memsize)} (#{report.total_allocated} objects)"
@retained << "#{report.scale_bytes(report.total_retained_memsize)} (#{report.total_retained} objects)"
return if ENV['CI']
require 'fileutils'
report_file = File.join(REPORTS_DIR, "#{sanitize(phase)}.txt")
FileUtils.mkdir_p(REPORTS_DIR)
report.pretty_print(to_file: report_file, scale_bytes: true)
end
def tabulate
table = Terminal::Table.new(headings: @headings.unshift('Phase')) do |t|
t << @allocated.unshift('Total allocated')
t << @retained.unshift('Total retained')
end
puts
puts table
puts "\nDetailed report(s) saved to #{REPORTS_DIR}/" unless ENV['CI']
end
def sanitize(string)
string.downcase.gsub(/[\W]/, '-').squeeze('-')
end
end end
Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first
profiler = ThemeRunner.new runner = ThemeRunner.new
Profiler.run do |x|
profile("Parsing") { profiler.compile } x.profile('parse') { runner.compile }
profile("Rendering") { profiler.render } x.profile('render') { runner.render }
x.tabulate
end