Skip to content

Commit dcb3abc

Browse files
committed
Improve the appearance of the benchmark suite.
1 parent 5a5e135 commit dcb3abc

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/base58/extensions/benchmark.cr

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,22 @@ module Benchmark
5757
end
5858

5959
class Job
60+
property fullscreen_report : Bool = false
61+
property scrollback : Int32 = 0
62+
6063
def initialize(calculation = 5, warmup = 2, interactive = STDOUT.tty?)
6164
@interactive = !!interactive
6265
@warmup_time = warmup.seconds
6366
@calculation_time = calculation.seconds
6467
@items = [] of Entry
65-
print "\e[s" if @interactive
68+
at_exit do
69+
cleanup_on_exit
70+
end
6671
end
6772

6873
def separator(label) : Benchmark::IPS::Entry
74+
self.fullscreen_report = true
75+
6976
item = Entry.new(label, ->(x : Int32) {})
7077
item.separator = true
7178
@items << item
@@ -74,6 +81,8 @@ module Benchmark
7481
end
7582

7683
def separator(label, &action : Proc(Int32, Nil)) : Benchmark::IPS::Entry
84+
self.fullscreen_report = true
85+
7786
item = Entry.new(label, action)
7887
item.separator = true
7988
@items << item
@@ -88,8 +97,9 @@ module Benchmark
8897
end
8998

9099
def report : Nil
91-
print "\e[2J\e[H" if @interactive
92100
max_label = ran_items.max_of { |item| count_non_control_characters(item.label) }
101+
print "\e[H\e[0J\e[?7l" if @interactive && fullscreen_report
102+
puts "#{"".rjust(max_label - @items.size)}Benchmark Report |#{"=" * ran_items.size}#{ran_items.size < @items.size ? "#" : ""}#{"-" * (@items.size - ran_items.size)}|"
93103
max_compare = ran_items.max_of &.human_compare.size
94104
max_bytes_per_op = ran_items.max_of &.bytes_per_op.humanize(base: 1024).size
95105

@@ -110,8 +120,17 @@ module Benchmark
110120
end
111121
end
112122

123+
private def cleanup_on_exit
124+
print "\e[?7h"
125+
end
126+
127+
private def calculate_scrollback
128+
self.scrollback = ran_items.size
129+
ran_items.select { |item| self.scrollback += item.label.to_s.scan(/\n/).size }
130+
end
131+
113132
private def run_warmup
114-
print "\e[2J\e[H" if @interactive
133+
print "\e[?7l\e[H\e[0J" if fullscreen_report
115134
@items.each_with_index do |item, index|
116135
print "\rWarming up [\e[48;5;231m#{" " * index}\e[0m\e[48;5;240m#{" " * (@items.size - index - 1)}\e[0m]" if @interactive
117136
next if item.separator?
@@ -130,7 +149,7 @@ module Benchmark
130149

131150
item.set_cycles(elapsed, count)
132151
end
133-
print "\e[2K"
152+
print "\e[2K\e[H"
134153
end
135154

136155
private def run_calculation
@@ -165,6 +184,8 @@ module Benchmark
165184
item.bytes_per_op = (bytes.to_f / cycles.to_f).round.to_u64
166185

167186
if @interactive
187+
calculate_scrollback
188+
print "\e[#{scrollback + 1}A\e[0J" if !fullscreen_report
168189
run_comparison
169190
report
170191
end

0 commit comments

Comments
 (0)