32
32
run_result (b:: Benchmark , p:: Parameters = b. params; kwargs... ) = Base. invokelatest (_run, b, p; kwargs... )
33
33
lineartrial (b:: Benchmark , p:: Parameters = b. params; kwargs... ) = Base. invokelatest (_lineartrial, b, p; kwargs... )
34
34
35
+ # #############################
36
+ # progress logging utilities #
37
+ # #############################
38
+
39
+ # As used in ProgressLogging.jl
40
+ # https://github.com/JunoLab/ProgressLogging.jl/blob/v0.1.0/src/ProgressLogging.jl#L11
41
+ const ProgressLevel = LogLevel (- 1 )
42
+
43
+ """
44
+ _withprogress(
45
+ name::AbstractString,
46
+ group::BenchmarkGroup;
47
+ kwargs...,
48
+ ) do progressid, nleaves, ndone
49
+ ...
50
+ end
51
+
52
+ Execute do block with following arguments:
53
+
54
+ * `progressid`: logging ID to be used for `@logmsg`.
55
+ * `nleaves`: total number of benchmarks counted at the root benchmark group.
56
+ * `ndone`: number of completed benchmarks
57
+
58
+ They are either extracted from `kwargs` (for sub-groups) or newly created
59
+ (for root benchmark group).
60
+ """
61
+ function _withprogress (
62
+ f,
63
+ name:: AbstractString ,
64
+ group:: BenchmarkGroup ;
65
+ progressid = nothing ,
66
+ nleaves = NaN ,
67
+ ndone = NaN ,
68
+ _... ,
69
+ )
70
+ if progressid != = nothing
71
+ return f (progressid, nleaves, ndone)
72
+ end
73
+ progressid = uuid4 ()
74
+ nleaves = length (leaves (group))
75
+ @logmsg (ProgressLevel, name, progress = NaN , _id = progressid)
76
+ try
77
+ return f (progressid, nleaves, 0 )
78
+ finally
79
+ @logmsg (ProgressLevel, name, progress = " done" , _id = progressid)
80
+ end
81
+ end
82
+
35
83
# ############
36
84
# execution #
37
85
# ############
@@ -43,21 +91,40 @@ lineartrial(b::Benchmark, p::Parameters = b.params; kwargs...) = Base.invokelate
43
91
function sample end
44
92
function _run end
45
93
46
- Base. run (b:: Benchmark , p:: Parameters = b. params; kwargs... ) = run_result (b, p; kwargs... )[1 ]
47
-
48
- function Base. run (group:: BenchmarkGroup , args... ; verbose:: Bool = false , pad = " " , kwargs... )
49
- result = similar (group)
50
- gcscrub () # run GC before running group, even if individual benchmarks don't manually GC
51
- i = 1
52
- for id in keys (group)
53
- verbose && println (pad, " ($(i) /$(length (group)) ) benchmarking " , repr (id), " ..." )
54
- took_seconds = @elapsed begin
55
- result[id] = run (group[id], args... ; verbose = verbose, pad = pad* " " , kwargs... )
94
+ Base. run (b:: Benchmark , p:: Parameters = b. params; progressid= nothing , nleaves= NaN , ndone= NaN , kwargs... ) =
95
+ run_result (b, p; kwargs... )[1 ]
96
+
97
+ Base. run (group:: BenchmarkGroup , args... ; verbose:: Bool = false , pad = " " , kwargs... ) =
98
+ _withprogress (" Benchmarking" , group; kwargs... ) do progressid, nleaves, ndone
99
+ result = similar (group)
100
+ gcscrub () # run GC before running group, even if individual benchmarks don't manually GC
101
+ i = 1
102
+ for id in keys (group)
103
+ progressid === nothing || @logmsg (
104
+ ProgressLevel,
105
+ " Benchmarking" ,
106
+ progress = ndone / nleaves,
107
+ _id = progressid
108
+ )
109
+ verbose &&
110
+ println (pad, " ($(i) /$(length (group)) ) benchmarking " , repr (id), " ..." )
111
+ took_seconds = @elapsed begin
112
+ result[id] = run (
113
+ group[id],
114
+ args... ;
115
+ verbose = verbose,
116
+ pad = pad * " " ,
117
+ kwargs... ,
118
+ progressid = progressid,
119
+ nleaves = nleaves,
120
+ ndone = ndone,
121
+ )
122
+ end
123
+ ndone += group[id] isa BenchmarkGroup ? length (leaves (group[id])) : 1
124
+ verbose && (println (pad, " done (took " , took_seconds, " seconds)" ); i += 1 )
56
125
end
57
- verbose && ( println (pad, " done (took " , took_seconds, " seconds) " ); i += 1 )
126
+ return result
58
127
end
59
- return result
60
- end
61
128
62
129
function _lineartrial (b:: Benchmark , p:: Parameters = b. params; maxevals = RESOLUTION, kwargs... )
63
130
params = Parameters (p; kwargs... )
@@ -118,18 +185,35 @@ for i in 1:8 (EVALS[((i*1000)+1):((i+1)*1000)] .= 11 - i) end # linearl
118
185
119
186
guessevals (t) = t <= length (EVALS) ? EVALS[t] : 1
120
187
121
- function tune! (group:: BenchmarkGroup ; verbose:: Bool = false , pad = " " , kwargs... )
122
- gcscrub () # run GC before running group, even if individual benchmarks don't manually GC
123
- i = 1
124
- for id in keys (group)
125
- verbose && println (pad, " ($(i) /$(length (group)) ) tuning " , repr (id), " ..." )
126
- took_seconds = @elapsed tune! (group[id]; verbose = verbose, pad = pad* " " , kwargs... )
127
- verbose && (println (pad, " done (took " , took_seconds, " seconds)" ); i += 1 )
188
+ tune! (group:: BenchmarkGroup ; verbose:: Bool = false , pad = " " , kwargs... ) =
189
+ _withprogress (" Tuning" , group; kwargs... ) do progressid, nleaves, ndone
190
+ gcscrub () # run GC before running group, even if individual benchmarks don't manually GC
191
+ i = 1
192
+ for id in keys (group)
193
+ progressid === nothing || @logmsg (
194
+ ProgressLevel,
195
+ " Tuning" ,
196
+ progress = ndone / nleaves,
197
+ _id = progressid
198
+ )
199
+ verbose && println (pad, " ($(i) /$(length (group)) ) tuning " , repr (id), " ..." )
200
+ took_seconds = @elapsed tune! (
201
+ group[id];
202
+ verbose = verbose,
203
+ pad = pad * " " ,
204
+ kwargs... ,
205
+ progressid = progressid,
206
+ nleaves = nleaves,
207
+ ndone = ndone,
208
+ )
209
+ ndone += group[id] isa BenchmarkGroup ? length (leaves (group[id])) : 1
210
+ verbose && (println (pad, " done (took " , took_seconds, " seconds)" ); i += 1 )
211
+ end
212
+ return group
128
213
end
129
- return group
130
- end
131
214
132
215
function tune! (b:: Benchmark , p:: Parameters = b. params;
216
+ progressid= nothing , nleaves= NaN , ndone= NaN , # ignored
133
217
verbose:: Bool = false , pad = " " , kwargs... )
134
218
warmup (b, verbose = false )
135
219
estimate = ceil (Int, minimum (lineartrial (b, p; kwargs... )))
0 commit comments