Module: SorbetView::Perf

Extended by:
T::Sig
Defined in:
lib/sorbet_view/perf.rb

Defined Under Namespace

Classes: Metric

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.enabledObject

Returns the value of attribute enabled.



22
23
24
# File 'lib/sorbet_view/perf.rb', line 22

def enabled
  @enabled
end

.metricsObject (readonly)

Returns the value of attribute metrics.



25
26
27
# File 'lib/sorbet_view/perf.rb', line 25

def metrics
  @metrics
end

Class Method Details

.measure(label, &blk) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/sorbet_view/perf.rb', line 32

def measure(label, &blk)
  unless @enabled
    return yield
  end

  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  result = yield
  elapsed_ms = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000.0

  metric = @metrics[label] ||= Metric.new
  metric.count += 1
  metric.total_ms += elapsed_ms
  metric.min_ms = elapsed_ms if elapsed_ms < metric.min_ms
  metric.max_ms = elapsed_ms if elapsed_ms > metric.max_ms

  result
end

.report(io: $stderr) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/sorbet_view/perf.rb', line 56

def report(io: $stderr)
  return if @metrics.empty?

  io.puts "\n=== SorbetView Performance Report ==="
  io.puts format('%-35s %8s %10s %10s %10s %10s', 'Label', 'Count', 'Total(ms)', 'Avg(ms)', 'Min(ms)', 'Max(ms)')
  io.puts '-' * 90

  @metrics.sort_by { |_, m| -m.total_ms }.each do |label, m|
    avg = m.count > 0 ? m.total_ms / m.count : 0.0
    min_val = m.min_ms == Float::INFINITY ? 0.0 : m.min_ms
    io.puts format('%-35s %8d %10.2f %10.2f %10.2f %10.2f', label, m.count, m.total_ms, avg, min_val, m.max_ms)
  end

  io.puts '=' * 90
  io.puts ''
end

.report_to_logger(logger) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/sorbet_view/perf.rb', line 74

def report_to_logger(logger)
  return if @metrics.empty?

  lines = ["\n=== SorbetView Performance Report ==="]
  lines << format('%-35s %8s %10s %10s %10s %10s', 'Label', 'Count', 'Total(ms)', 'Avg(ms)', 'Min(ms)', 'Max(ms)')
  lines << '-' * 90

  @metrics.sort_by { |_, m| -m.total_ms }.each do |label, m|
    avg = m.count > 0 ? m.total_ms / m.count : 0.0
    min_val = m.min_ms == Float::INFINITY ? 0.0 : m.min_ms
    lines << format('%-35s %8d %10.2f %10.2f %10.2f %10.2f', label, m.count, m.total_ms, avg, min_val, m.max_ms)
  end

  lines << '=' * 90
  logger.info(lines.join("\n"))
end

.reset!Object



51
52
53
# File 'lib/sorbet_view/perf.rb', line 51

def reset!
  @metrics = {}
end