Skip to content

Instantly share code, notes, and snippets.

@ggcampinho
Last active September 15, 2017 21:37
Show Gist options
  • Save ggcampinho/a2cb49464e3ce01eafd7baedb165ee6c to your computer and use it in GitHub Desktop.
Save ggcampinho/a2cb49464e3ce01eafd7baedb165ee6c to your computer and use it in GitHub Desktop.
translate_with_else
defmodule CaseBench do
use Benchfella
defp ok_or_error_with_atom do
Stream.cycle([:ok, {:error, :err}])
|> Enum.take(1000)
end
defp ok_or_error_with_string do
Stream.cycle([:ok, {:error, "err"}])
|> Enum.take(1000)
end
bench "case with else clauses" do
for x <- ok_or_error_with_atom(),
y <- ok_or_error_with_string() do
case x do
:ok ->
case y do
:ok -> :ok
{:error, error} when is_atom(error) -> :error
{:error, _error} -> :error
end
{:error, error} when is_atom(error) -> :error
{:error, _error} -> :error
end
end
end
bench "two cases" do
for x <- ok_or_error_with_atom(),
y <- ok_or_error_with_string() do
{branch, result} = case x do
:ok ->
case y do
:ok -> {:do, :ok}
other -> {:else, other}
end
other -> {:else, other}
end
case branch do
:do -> result
:else ->
case result do
{:error, error} when is_atom(error) -> :error
{:error, _error} -> :error
end
end
end
end
end
Settings:
duration: 1.0 s
## CaseBench
[23:36:41] 1/2: case with else clauses
[23:36:43] 2/2: two cases
Finished in 3.46 seconds
## CaseBench
benchmark name iterations average time
two cases 10 148161.50 µs/op
case with else clauses 10 151157.40 µs/op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment