Skip to content

Commit

Permalink
Add Elixir benchmarker
Browse files Browse the repository at this point in the history
  • Loading branch information
Doruk Gurleyen committed Dec 2, 2021
1 parent b13127e commit 66af313
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 8 deletions.
4 changes: 2 additions & 2 deletions challenges/2021/01.exs
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,5 @@ defmodule Challenge do
end
end

Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1")
Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2")
Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1")
Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2")
20 changes: 20 additions & 0 deletions challenges/2021/02.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Code.compile_file(Path.join([__ENV__.file], ["../../../utils/utils.exs"]))

defmodule Challenge do
@moduledoc false

def input do
Utils.load_input(__ENV__.file)
end

def first_result(input) do
input
end

def second_result(input) do
input
end
end

Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1")
Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2")
Empty file added challenges/2021/inputs/02.txt
Empty file.
8 changes: 2 additions & 6 deletions challenges/2021/template.exs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ Code.compile_file(Path.join([__ENV__.file], ["../../../utils/utils.exs"]))
defmodule Challenge do
@moduledoc false

def input do
Utils.load_input(__ENV__.file)
end

def first_result(input) do
input
end
Expand All @@ -16,5 +12,5 @@ defmodule Challenge do
end
end

Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1")
Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2")
Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1")
Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2")
35 changes: 35 additions & 0 deletions utils/utils.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ defmodule Utils do
|> String.split("\n")
end

def run(function, file, label) do
args = System.argv()

if "-b" in args do
times_index = Enum.find_index(args, &(&1 == "-b")) + 1
times = args |> Enum.at(times_index, "20") |> String.to_integer()
benchmark(function, file, label, times)
else
execute(function, file, label)
end
end

def execute(function, file, label) do
input = load_input(file)

Expand All @@ -18,6 +30,29 @@ defmodule Utils do
|> log_result(label)
end

def benchmark(function, file, label, times) do
input = load_input(file)

average_time =
1..times
|> Enum.map(fn _ ->
fn -> function.(input) end
|> :timer.tc()
|> elem(0)
|> Kernel./(1_000)
end)
|> Enum.reduce(
[nil, 0],
fn
val, [nil, 0] -> [val, 1]
val, [avg, count] -> [(avg * count + val) / (count + 1), count + 1]
end
)
|> List.first()

IO.puts("#{label} ran #{times} times with an average of #{average_time}ms")
end

defp log_result({time, result}, label) do
IO.inspect(result, label: label)
IO.puts("#{label} completed in #{time / 1_000}ms")
Expand Down

0 comments on commit 66af313

Please sign in to comment.