From 11a92c84ac04c5092e2db0dcfabec303c69f85c1 Mon Sep 17 00:00:00 2001 From: Benjamin Schultzer Date: Mon, 3 Mar 2025 12:43:51 -0500 Subject: [PATCH] Add benchmark --- bench.exs | 11 +++++++++++ benchmarks/v0.1.0.md | 42 ++++++++++++++++++++++++++++++++++++++++++ mix.exs | 6 ++++-- mix.lock | 3 +++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 bench.exs create mode 100644 benchmarks/v0.1.0.md diff --git a/bench.exs b/bench.exs new file mode 100644 index 0000000..00b6442 --- /dev/null +++ b/bench.exs @@ -0,0 +1,11 @@ +import SQL +range = 1..10_000 +Benchee.run( + %{ + "to_stirng" => fn -> for _ <- range, do: to_string(~SQL[with recursive temp (n, fact) as (select 0, 1 union all select n+1, (n+1)*fact from temp where n < 9)]) end, + "to_sql" => fn -> for _ <- range, do: SQL.to_sql(~SQL[with recursive temp (n, fact) as (select 0, 1 union all select n+1, (n+1)*fact from temp where n < 9)]) end, + "inspect" => fn -> for _ <- range, do: inspect(~SQL[with recursive temp (n, fact) as (select 0, 1 union all select n+1, (n+1)*fact from temp where n < 9)]) end + }, + time: 10, + memory_time: 2 +) diff --git a/benchmarks/v0.1.0.md b/benchmarks/v0.1.0.md new file mode 100644 index 0000000..49ab678 --- /dev/null +++ b/benchmarks/v0.1.0.md @@ -0,0 +1,42 @@ +➜ sql git:(benchmark) ✗ mix bench +Operating System: macOS +CPU Information: Apple M1 Max +Number of Available Cores: 10 +Available memory: 64 GB +Elixir 1.18.0 +Erlang 27.2 +JIT enabled: true + +Benchmark suite executing with the following configuration: +warmup: 2 s +time: 10 s +memory time: 2 s +reduction time: 0 ns +parallel: 1 +inputs: none specified +Estimated total run time: 42 s + +Benchmarking inspect ... +Benchmarking to_sql ... +Benchmarking to_stirng ... +Calculating statistics... +Formatting results... + +Name ips average deviation median 99th % +to_stirng 1.40 713.82 ms ±2.01% 711.52 ms 742.02 ms +to_sql 1.37 729.90 ms ±1.90% 733.32 ms 749.88 ms +inspect 1.35 742.32 ms ±1.93% 745.09 ms 764.21 ms + +Comparison: +to_stirng 1.40 +to_sql 1.37 - 1.02x slower +16.08 ms +inspect 1.35 - 1.04x slower +28.50 ms + +Memory usage statistics: + +Name Memory usage +to_stirng 1.02 GB +to_sql 1.02 GB - 1.00x memory usage -0.00025 GB +inspect 1.02 GB - 1.01x memory usage +0.00515 GB + +**All measurements for memory usage were the same** diff --git a/mix.exs b/mix.exs index ac0973b..8415dc6 100644 --- a/mix.exs +++ b/mix.exs @@ -15,7 +15,8 @@ defmodule SQL.MixProject do description: "Brings an extensible SQL parser and sigil to Elixir, confidently write SQL with automatic parameterized queries.", name: "SQL", docs: docs(), - package: package() + package: package(), + aliases: [bench: "run bench.exs"] ] end @@ -39,8 +40,9 @@ defmodule SQL.MixProject do defp deps do [ - {:ex_doc, "~> 0.37", only: :dev}, + {:benchee, "~> 1.3", only: :dev}, {:ecto_sql, "~> 3.12", only: [:dev, :test]}, + {:ex_doc, "~> 0.37", only: :dev}, {:postgrex, ">= 0.0.0", only: [:dev, :test]}, ] end diff --git a/mix.lock b/mix.lock index 225fce6..e41dee6 100644 --- a/mix.lock +++ b/mix.lock @@ -1,6 +1,8 @@ %{ + "benchee": {:hex, :benchee, "1.3.1", "c786e6a76321121a44229dde3988fc772bca73ea75170a73fd5f4ddf1af95ccf", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.0", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "76224c58ea1d0391c8309a8ecbfe27d71062878f59bd41a390266bf4ac1cc56d"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, + "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "earmark_parser": {:hex, :earmark_parser, "1.4.43", "34b2f401fe473080e39ff2b90feb8ddfeef7639f8ee0bbf71bb41911831d77c5", [:mix], [], "hexpm", "970a3cd19503f5e8e527a190662be2cee5d98eed1ff72ed9b3d1a3d466692de8"}, "ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, @@ -10,5 +12,6 @@ "makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"}, + "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, }