Skip to content

Commit 598075e

Browse files
authored
add @benchmarkset & @case for defining benchmark suite (#147)
1 parent 2b70f56 commit 598075e

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

src/BenchmarkTools.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ export BenchmarkGroup,
5252
improvements,
5353
@tagged,
5454
addgroup!,
55-
leaves
55+
leaves,
56+
@benchmarkset,
57+
@case
5658

5759
######################
5860
# Execution Strategy #

src/groups.jl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,53 @@ function Base.show(io::IO, group::BenchmarkGroup)
301301
count += 1
302302
end
303303
end
304+
305+
306+
const benchmark_stack = []
307+
308+
macro benchmarkset(title, ex)
309+
esc(benchmarkset_m(title, ex))
310+
end
311+
312+
macro case(title, xs...)
313+
esc(:($(Symbol("#suite#"))[$title] = @benchmarkable $(xs...)))
314+
end
315+
316+
function benchmarkset_m(title, ex::Expr)
317+
stack = GlobalRef(BenchmarkTools, :benchmark_stack)
318+
init = quote
319+
if isempty($stack)
320+
push!($stack, $BenchmarkGroup())
321+
end
322+
end
323+
exec = quote
324+
if length($stack) == 1
325+
pop!($stack)
326+
end
327+
end
328+
return if ex.head === :block
329+
quote
330+
$init
331+
$(benchmarkset_block(title, ex))
332+
$exec
333+
end
334+
elseif ex.head === :for
335+
quote
336+
$init
337+
$(Expr(ex.head, ex.args[1], benchmarkset_block(title, ex.args[2])))
338+
$exec
339+
end
340+
end
341+
end
342+
343+
function benchmarkset_block(title, ex::Expr)
344+
stack = GlobalRef(BenchmarkTools, :benchmark_stack)
345+
quote
346+
let $(Symbol("#root#")) = last($stack)
347+
$(Symbol("#root#"))[$title] = $(Symbol("#suite#")) = BenchmarkGroup()
348+
push!($stack, $(Symbol("#suite#")))
349+
$ex
350+
pop!($stack)
351+
end
352+
end
353+
end

test/GroupsTests.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,16 @@ g2[[1, "a", :b]] = "hello" # should create higher levels on the fly
278278

279279
@test g1 == g2
280280

281+
@testset "benchmarkset" begin
282+
g1 = @benchmarkset "test set" begin
283+
@case "test case 1" 1 + 1
284+
@case "test case 2" 2 + 2
285+
end
286+
287+
@test haskey(g1, "test set")
288+
@test haskey(g1["test set"], "test case 1")
289+
@test haskey(g1["test set"], "test case 2")
290+
end
281291
# pretty printing #
282292
#-----------------#
283293

0 commit comments

Comments
 (0)