summaryrefslogtreecommitdiff
path: root/scripts/generate-gems-size-metrics-static
blob: 2406e7209163f671dae2bf81b5cafc069c7d7241 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env ruby
# frozen_string_literal: true

abort "usage: #{__FILE__} <memory_bundle_mem_file_name>" unless ARGV.length == 1
memory_bundle_mem_file_name = ARGV.first

full_report = File.readlines(memory_bundle_mem_file_name)

def total_size(memory_bundle_mem_report)
  stats = /TOP: (?<total_mibs_str>.*) MiB/.match(memory_bundle_mem_report.first)
  abort 'failed to process the benchmark output' unless stats
  "gem_total_size_mb #{stats[:total_mibs_str].to_f.round(1)}"
end

TOP_LEVEL_GEM_LOG_FORMAT = /^  (?<gem_name>\S.*):\s*(?<gem_size>\d[.\d]*)\s*MiB/.freeze
def all_gems(memory_bundle_mem_report)
  memory_bundle_mem_report.map do |line|
    TOP_LEVEL_GEM_LOG_FORMAT.match(line)
  end.compact
end

def gems_as_metrics(gems_match_data)
  gems_match_data.map do |gem|
    gem_name = gem[:gem_name]
    gem_size_mb = gem[:gem_size].to_f.round(1)
    "gem_size_mb{name=\"#{gem_name}\"} #{gem_size_mb}"
  end
end

puts total_size(full_report)
puts gems_as_metrics(all_gems(full_report)).sort(&:casecmp)