Skip to content

Commit

Permalink
Merge pull request #130 from PragTob/pass-values-to-after
Browse files Browse the repository at this point in the history
Pass return values of the main function to the after_each hook
  • Loading branch information
PragTob committed Oct 1, 2017
2 parents 050534b + f238bac commit 995be92
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 22 deletions.
15 changes: 8 additions & 7 deletions lib/benchee/benchmark/runner.ex
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ defmodule Benchee.Benchmark.Runner do
RepeatN.repeat_n(
fn ->
run_before_each(scenario, scenario_context)
main.()
run_after_each(scenario, scenario_context)
return_value = main.()
run_after_each(return_value, scenario, scenario_context)
end,
iterations
)
Expand Down Expand Up @@ -221,8 +221,8 @@ defmodule Benchee.Benchmark.Runner do
benchmarking_function: function
}) do
run_before_each(scenario, scenario_context)
{microseconds, _return_value} = :timer.tc function
run_after_each(scenario, scenario_context)
{microseconds, return_value} = :timer.tc function
run_after_each(return_value, scenario, scenario_context)
microseconds
end
defp measure_iteration(_scenario, %ScenarioContext{
Expand All @@ -246,13 +246,14 @@ defmodule Benchee.Benchmark.Runner do
if local_before_each, do: local_before_each.()
end

defp run_after_each(%{
defp run_after_each(return_value,
%{
after_each: local_after_each
},
%{
config: %{after_each: global_after_each}
}) do
if local_after_each, do: local_after_each.()
if global_after_each, do: global_after_each.()
if local_after_each, do: local_after_each.(return_value)
if global_after_each, do: global_after_each.(return_value)
end
end
72 changes: 59 additions & 13 deletions test/benchee/benchmark/runner_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 100,
before_each: fn -> send(me, :before) end,
after_each: fn -> send(me, :after) end
after_each: fn(_) -> send(me, :after) end
}
}
|> test_suite
Expand All @@ -273,7 +273,7 @@ defmodule Benchee.Benchmark.RunnerTest do
|> Benchmark.benchmark("job", {
fn -> :timer.sleep 1 end,
before_each: fn -> send(me, :before) end,
after_each: fn -> send(me, :after) end,
after_each: fn(_) -> send(me, :after) end,
before_scenario: fn -> send(me, :before_scenario) end,
after_scenario: fn -> send(me, :after_scenario) end})
|> Benchmark.measure(TestPrinter)
Expand All @@ -295,7 +295,7 @@ defmodule Benchee.Benchmark.RunnerTest do
|> Benchmark.benchmark("job", {
fn -> :timer.sleep 1 end,
before_each: fn -> send(me, :before) end,
after_each: fn -> send(me, :after) end,
after_each: fn(_) -> send(me, :after) end,
before_scenario: fn -> send(me, :before_scenario) end,
after_scenario: fn -> send(me, :after_scenario) end})
|> Benchmark.measure(TestPrinter)
Expand All @@ -312,7 +312,7 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 100,
before_each: fn -> send me, :global_before end,
after_each: fn -> send me, :global_after end,
after_each: fn(_) -> send me, :global_after end,
before_scenario: fn -> send me, :global_before_scenario end,
after_scenario: fn -> send me, :global_after_scenario end,
inputs: %{"one" => 1, "two" => 2}
Expand All @@ -322,7 +322,7 @@ defmodule Benchee.Benchmark.RunnerTest do
|> Benchmark.benchmark("job", {
fn(_) -> :timer.sleep 1 end,
before_each: fn -> send(me, :local_before) end,
after_each: fn -> send(me, :local_after) end,
after_each: fn(_) -> send(me, :local_after) end,
before_scenario: fn -> send(me, :local_before_scenario) end,
after_scenario: fn -> send(me, :local_after_scenario) end})
|> Benchmark.measure(TestPrinter)
Expand All @@ -342,7 +342,7 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 100,
before_each: fn -> send me, :global_before end,
after_each: fn -> send me, :global_after end,
after_each: fn(_) -> send me, :global_after end,
after_scenario: fn -> send me, :global_after_scenario end
}
}
Expand All @@ -368,19 +368,19 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 100,
before_each: fn -> send me, :global_before end,
after_each: fn -> send me, :global_after end
after_each: fn(_) -> send me, :global_after end
}
}
|> test_suite
|> Benchmark.benchmark("job", {
fn -> :timer.sleep 1 end,
before_each: fn -> send me, :local_before end,
after_each: fn -> send me, :local_after end,
after_each: fn(_) -> send me, :local_after end,
before_scenario: fn -> send me, :local_before_scenario end})
|> Benchmark.benchmark("job 2", {
fn -> :timer.sleep 1 end,
before_each: fn -> send me, :local_2_before end,
after_each: fn -> send me, :local_2_after end,
after_each: fn(_) -> send me, :local_2_after end,
after_scenario: fn -> send me, :local_2_after_scenario end})
|> Benchmark.measure(TestPrinter)

Expand All @@ -399,7 +399,7 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 10_000,
before_each: fn -> send me, :global_before end,
after_each: fn -> send me, :global_after end,
after_each: fn(_) -> send me, :global_after end,
before_scenario: fn -> send me, :global_before_scenario end,
after_scenario: fn -> send me, :global_after_scenario end,
}
Expand All @@ -410,7 +410,7 @@ defmodule Benchee.Benchmark.RunnerTest do
|> Benchmark.benchmark("job", {
fn -> :timer.sleep 1 end,
before_each: fn -> send me, :local_before end,
after_each: fn -> send me, :local_after end,
after_each: fn(_) -> send me, :local_after end,
before_scenario: fn -> send(me, :local_before_scenario) end,
after_scenario: fn -> send(me, :local_after_scenario) end})
|> Benchmark.measure(TestPrinter)
Expand Down Expand Up @@ -461,15 +461,15 @@ defmodule Benchee.Benchmark.RunnerTest do
warmup: 0,
time: 1_000,
before_each: fn -> send me, :global_before end,
after_each: fn -> send me, :global_after end
after_each: fn(_) -> send me, :global_after end
}
}
result =
suite
|> test_suite
|> Benchmark.benchmark("job", {fn -> 0 end,
before_each: fn -> send me, :local_before end,
after_each: fn -> send me, :local_after end})
after_each: fn(_) -> send me, :local_after end})
|> Benchmark.measure(TestPrinter)

{:messages, messages} = Process.info self(), :messages
Expand Down Expand Up @@ -499,5 +499,51 @@ defmodule Benchee.Benchmark.RunnerTest do
assert hook_call_count > sample_size + 10
end

test "after_each hooks have access to the return value of the invocation" do
me = self()
%Suite{
configuration: %{
warmup: 100,
time: 100,
after_each: fn(out) -> send(me, {:global, out}) end
}
}
|> test_suite
|> Benchmark.benchmark("job", {fn ->
# still keep to make sure we only get one iteration and not too fast
:timer.sleep 1
:value
end, after_each: fn(out) -> send(me, {:local, out}) end})
|> Benchmark.measure(TestPrinter)

assert_received_exactly [
{:global, :value}, {:local, :value},
{:global, :value}, {:local, :value}
]
end

test "after_each hooks with super fast functions" do
me = self()
%Suite{
configuration: %{
warmup: 100,
time: 100,
after_each: fn(out) -> send(me, {:global, out}) end
}
}
|> test_suite
|> Benchmark.benchmark("job", {fn ->
# still keep to make sure we only get one iteration and not too fast
:timer.sleep 1
:value
end, after_each: fn(out) -> send(me, {:local, out}) end})
|> Benchmark.measure(TestPrinter)

assert_received {:global, :value}
assert_received {:local, :value}
assert_received {:global, :value}
assert_received {:local, :value}
end

end
end
4 changes: 2 additions & 2 deletions test/benchee_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -331,14 +331,14 @@ defmodule BencheeTest do
"sleeper" => {
fn -> :timer.sleep 1 end,
before_each: fn -> send myself, :local_before end,
after_each: fn -> send myself, :local_after end,
after_each: fn(_) -> send myself, :local_after end,
before_scenario: fn -> send myself, :local_before_scenario end,
after_scenario: fn -> send myself, :local_after_scenario end},
"sleeper 2" => fn -> :timer.sleep 1 end
}, time: 0.0001,
warmup: 0,
before_each: fn -> send myself, :global_before end,
after_each: fn -> send myself, :global_after end,
after_each: fn(_) -> send myself, :global_after end,
before_scenario: fn -> send myself, :global_before_scenario end,
after_scenario: fn -> send myself, :global_after_scenario end
end
Expand Down

0 comments on commit 995be92

Please sign in to comment.