Something went wrong. Try again.
An Ecto SQLite3 adapter.
Something went wrong. Try again.
2.4 kB · 60 lines
Elixir
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# -----------------------------------Goal--------------------------------------# Compare the implementation of loading raw database data into Ecto structures by# the different database adapters
# -------------------------------Description-----------------------------------# Repo.load/2 is an important step of a database query.# This benchmark tracks performance of loading "raw" data into ecto structures# Raw data can be in different types (e.g. keyword lists, maps), in this tests# we benchmark against map inputs
# ----------------------------Factors(don't change)---------------------------# Different adapters supported by Ecto, each one has its own implementation that# is tested against different inputs
# ----------------------------Parameters(change)-------------------------------# Different sizes of raw data(small, medium, big) and different attribute types# such as UUID, Date and Time fetched from the database and needs to be# loaded into Ecto structures.
Code.require_file("../../support/setup.exs", __DIR__)
alias Ecto.Bench.User
inputs = %{ "Small 1 Thousand" => 1..1_000 |> Enum.map(fn _ -> %{name: "Alice", email: "email@email.com"} end), "Medium 100 Thousand" => 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", email: "email@email.com"} end), "Big 1 Million" => 1..1_000_000 |> Enum.map(fn _ -> %{name: "Alice", email: "email@email.com"} end), "Time attr" => 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", time_attr: ~T[21:25:04.361140]} end), "Date attr" => 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", date_attr: ~D[2018-06-20]} end), # "NaiveDateTime attr" => # 1..100_000 # |> Enum.map(fn _ -> %{name: "Alice", naive_datetime_attr: ~N[2019-06-20 21:32:07.424178]} end), "UUID attr" => 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", uuid: Ecto.UUID.bingenerate()} end)}
jobs = %{ "SQLite3 Loader" => fn data -> Enum.map(data, &Ecto.Bench.SQLite3Repo.load(User, &1)) end, "Pg Loader" => fn data -> Enum.map(data, &Ecto.Bench.PgRepo.load(User, &1)) end, "MyXQL Loader" => fn data -> Enum.map(data, &Ecto.Bench.MyXQLRepo.load(User, &1)) end}
path = System.get_env("BENCHMARKS_OUTPUT_PATH") || "bench/results"
Benchee.run( jobs, inputs: inputs, formatters: [ Benchee.Formatters.Console, {Benchee.Formatters.Markdown, file: Path.join(path, "load.md")} ])