Current section
Files
Jump to
Current section
Files
src/bench@memory_adapter_bench.erl
-module(bench@memory_adapter_bench).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/bench/memory_adapter_bench.gleam").
-export([main/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/bench/memory_adapter_bench.gleam", 21).
?DOC(" Create a user schema for benchmarking\n").
-spec user_schema() -> cquill@schema:schema().
user_schema() ->
_pipe = cquill@schema:new(<<"users"/utf8>>),
_pipe@2 = cquill@schema:field(
_pipe,
begin
_pipe@1 = cquill@schema@field:integer(<<"id"/utf8>>),
cquill@schema@field:primary_key(_pipe@1)
end
),
_pipe@4 = cquill@schema:field(
_pipe@2,
begin
_pipe@3 = cquill@schema@field:string(<<"email"/utf8>>),
cquill@schema@field:not_null(_pipe@3)
end
),
_pipe@5 = cquill@schema:field(
_pipe@4,
cquill@schema@field:string(<<"name"/utf8>>)
),
_pipe@6 = cquill@schema:field(
_pipe@5,
cquill@schema@field:boolean(<<"active"/utf8>>)
),
_pipe@7 = cquill@schema:field(
_pipe@6,
cquill@schema@field:integer(<<"age"/utf8>>)
),
cquill@schema:single_primary_key(_pipe@7, <<"id"/utf8>>).
-file("src/bench/memory_adapter_bench.gleam", 32).
?DOC(" Create a store with the user table\n").
-spec create_store() -> cquill@adapter@memory:memory_store().
create_store() ->
_pipe = cquill@adapter@memory:new(),
cquill@adapter@memory:create_table_from_schema(_pipe, user_schema()).
-file("src/bench/memory_adapter_bench.gleam", 38).
?DOC(" Create a store pre-populated with n users\n").
-spec create_populated_store(integer()) -> cquill@adapter@memory:memory_store().
create_populated_store(Count) ->
Store = create_store(),
Rows = begin
_pipe = gleam@list:range(1, Count),
gleam@list:map(
_pipe,
fun(I) ->
Row = [gleam_stdlib:identity(I),
gleam_stdlib:identity(
<<<<"user"/utf8, (erlang:integer_to_binary(I))/binary>>/binary,
"@example.com"/utf8>>
),
gleam_stdlib:identity(
<<"User "/utf8, (erlang:integer_to_binary(I))/binary>>
),
gleam_stdlib:identity(true),
gleam_stdlib:identity(20 + (I rem 50))],
{erlang:integer_to_binary(I), Row}
end
)
end,
case cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows) of
{ok, {New_store, _}} ->
New_store;
{error, _} ->
Store
end.
-file("src/bench/memory_adapter_bench.gleam", 60).
?DOC(" Create a single user row\n").
-spec create_user_row(integer()) -> list(gleam@dynamic:dynamic_()).
create_user_row(Id) ->
[gleam_stdlib:identity(Id),
gleam_stdlib:identity(
<<<<"user"/utf8, (erlang:integer_to_binary(Id))/binary>>/binary,
"@example.com"/utf8>>
),
gleam_stdlib:identity(
<<"User "/utf8, (erlang:integer_to_binary(Id))/binary>>
),
gleam_stdlib:identity(true),
gleam_stdlib:identity(25)].
-file("src/bench/memory_adapter_bench.gleam", 75).
?DOC(" Benchmark single row insert\n").
-spec bench_single_insert() -> nil.
bench_single_insert() ->
Store = create_store(),
Row = create_user_row(1),
_ = cquill@adapter@memory:insert_row(
Store,
<<"users"/utf8>>,
<<"1"/utf8>>,
Row
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 83).
?DOC(" Benchmark batch insert of 10 rows\n").
-spec bench_batch_insert_10() -> nil.
bench_batch_insert_10() ->
Store = create_store(),
Rows = begin
_pipe = gleam@list:range(1, 10),
gleam@list:map(
_pipe,
fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end
)
end,
_ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows),
nil.
-file("src/bench/memory_adapter_bench.gleam", 93).
?DOC(" Benchmark batch insert of 100 rows\n").
-spec bench_batch_insert_100() -> nil.
bench_batch_insert_100() ->
Store = create_store(),
Rows = begin
_pipe = gleam@list:range(1, 100),
gleam@list:map(
_pipe,
fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end
)
end,
_ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows),
nil.
-file("src/bench/memory_adapter_bench.gleam", 103).
?DOC(" Benchmark batch insert of 1000 rows\n").
-spec bench_batch_insert_1000() -> nil.
bench_batch_insert_1000() ->
Store = create_store(),
Rows = begin
_pipe = gleam@list:range(1, 1000),
gleam@list:map(
_pipe,
fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end
)
end,
_ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows),
nil.
-file("src/bench/memory_adapter_bench.gleam", 117).
?DOC(" Benchmark get single row by key\n").
-spec bench_get_by_key() -> nil.
bench_get_by_key() ->
Store = create_populated_store(1000),
_ = cquill@adapter@memory:get_row(Store, <<"users"/utf8>>, <<"500"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 124).
?DOC(" Benchmark get all rows from small table (100 rows)\n").
-spec bench_get_all_100() -> nil.
bench_get_all_100() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 131).
?DOC(" Benchmark get all rows from medium table (1000 rows)\n").
-spec bench_get_all_1000() -> nil.
bench_get_all_1000() ->
Store = create_populated_store(1000),
_ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 138).
?DOC(" Benchmark get all rows from large table (10000 rows)\n").
-spec bench_get_all_10000() -> nil.
bench_get_all_10000() ->
Store = create_populated_store(10000),
_ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 145).
?DOC(" Benchmark row count operation\n").
-spec bench_row_count() -> nil.
bench_row_count() ->
Store = create_populated_store(1000),
_ = cquill@adapter@memory:row_count(Store, <<"users"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 156).
?DOC(" Benchmark single row update\n").
-spec bench_single_update() -> nil.
bench_single_update() ->
Store = create_populated_store(100),
Updated_row = [gleam_stdlib:identity(50),
gleam_stdlib:identity(<<"updated@example.com"/utf8>>),
gleam_stdlib:identity(<<"Updated User"/utf8>>),
gleam_stdlib:identity(false),
gleam_stdlib:identity(30)],
_ = cquill@adapter@memory:update_row(
Store,
<<"users"/utf8>>,
<<"50"/utf8>>,
Updated_row
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 170).
?DOC(" Benchmark update all rows matching predicate\n").
-spec bench_update_all_matching() -> nil.
bench_update_all_matching() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:update_all(
Store,
<<"users"/utf8>>,
fun(_, _) -> true end,
fun(Row) -> case Row of
[Id, Email, Name, _, Age] ->
[Id, Email, Name, gleam_stdlib:identity(false), Age];
_ ->
Row
end end
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 194).
?DOC(" Benchmark single row delete\n").
-spec bench_single_delete() -> nil.
bench_single_delete() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:delete_row(Store, <<"users"/utf8>>, <<"50"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 201).
?DOC(" Benchmark delete all rows matching predicate\n").
-spec bench_delete_all_matching() -> nil.
bench_delete_all_matching() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:delete_all(
Store,
<<"users"/utf8>>,
fun(Key, _) -> case gleam_stdlib:parse_int(Key) of
{ok, Id} ->
(Id rem 2) =:= 0;
{error, _} ->
false
end end
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 215).
?DOC(" Benchmark truncate table\n").
-spec bench_truncate_table() -> nil.
bench_truncate_table() ->
Store = create_populated_store(1000),
_ = cquill@adapter@memory:delete_all_rows(Store, <<"users"/utf8>>),
nil.
-file("src/bench/memory_adapter_bench.gleam", 226).
?DOC(" Benchmark transaction with commit\n").
-spec bench_transaction_commit() -> nil.
bench_transaction_commit() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:execute_transaction(
Store,
fun(Tx_store) ->
Row = create_user_row(999),
case cquill@adapter@memory:insert_row(
Tx_store,
<<"users"/utf8>>,
<<"999"/utf8>>,
Row
) of
{ok, New_store} ->
{ok, {New_store, nil}};
{error, E} ->
{error, E}
end
end
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 240).
?DOC(" Benchmark transaction with rollback\n").
-spec bench_transaction_rollback() -> nil.
bench_transaction_rollback() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:execute_transaction(
Store,
fun(Tx_store) ->
Row = create_user_row(50),
case cquill@adapter@memory:insert_row(
Tx_store,
<<"users"/utf8>>,
<<"50"/utf8>>,
Row
) of
{ok, New_store} ->
{ok, {New_store, nil}};
{error, E} ->
{error, E}
end
end
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 256).
?DOC(" Benchmark nested transactions (savepoints)\n").
-spec bench_nested_transaction() -> nil.
bench_nested_transaction() ->
Store = create_populated_store(100),
_ = cquill@adapter@memory:execute_transaction(
Store,
fun(Tx_store) ->
case cquill@adapter@memory:create_savepoint(
Tx_store,
<<"sp1"/utf8>>
) of
{ok, Sp_store} ->
Row = create_user_row(999),
case cquill@adapter@memory:insert_row(
Sp_store,
<<"users"/utf8>>,
<<"999"/utf8>>,
Row
) of
{ok, New_store} ->
case cquill@adapter@memory:release_savepoint(
New_store,
<<"sp1"/utf8>>
) of
{ok, Final_store} ->
{ok, {Final_store, nil}};
{error, _} ->
{ok, {Sp_store, nil}}
end;
{error, E} ->
{error, E}
end;
{error, _} ->
{ok, {Tx_store, nil}}
end
end
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 283).
?DOC(" Benchmark unique constraint check on insert\n").
-spec bench_unique_constraint_check() -> nil.
bench_unique_constraint_check() ->
Store = create_populated_store(100),
Row = create_user_row(50),
_ = cquill@adapter@memory:insert_row(
Store,
<<"users"/utf8>>,
<<"50"/utf8>>,
Row
),
nil.
-file("src/bench/memory_adapter_bench.gleam", 295).
-spec main() -> nil.
main() ->
gleam_stdlib:println(<<""/utf8>>),
gleam_stdlib:println(<<"cquill Memory Adapter Benchmarks"/utf8>>),
gleam_stdlib:println(<<"================================="/utf8>>),
gleam_stdlib:println(<<""/utf8>>),
Quick = bench@bench:quick_config(),
Default = bench@bench:default_config(),
Insert_suite = bench@bench:run_suite(
<<"Insert Operations"/utf8>>,
[{<<"Single insert"/utf8>>, fun bench_single_insert/0},
{<<"Batch insert (10 rows)"/utf8>>, fun bench_batch_insert_10/0},
{<<"Batch insert (100 rows)"/utf8>>, fun bench_batch_insert_100/0}],
Default
),
Batch_insert_suite = bench@bench:run_suite(
<<"Large Batch Insert"/utf8>>,
[{<<"Batch insert (1000 rows)"/utf8>>, fun bench_batch_insert_1000/0}],
Quick
),
Query_suite = bench@bench:run_suite(
<<"Query Operations"/utf8>>,
[{<<"Get by key (1000 rows)"/utf8>>, fun bench_get_by_key/0},
{<<"Get all (100 rows)"/utf8>>, fun bench_get_all_100/0},
{<<"Get all (1000 rows)"/utf8>>, fun bench_get_all_1000/0},
{<<"Row count"/utf8>>, fun bench_row_count/0}],
Default
),
Large_query_suite = bench@bench:run_suite(
<<"Large Query Operations"/utf8>>,
[{<<"Get all (10000 rows)"/utf8>>, fun bench_get_all_10000/0}],
Quick
),
Update_suite = bench@bench:run_suite(
<<"Update Operations"/utf8>>,
[{<<"Single update"/utf8>>, fun bench_single_update/0},
{<<"Update all matching"/utf8>>, fun bench_update_all_matching/0}],
Default
),
Delete_suite = bench@bench:run_suite(
<<"Delete Operations"/utf8>>,
[{<<"Single delete"/utf8>>, fun bench_single_delete/0},
{<<"Delete matching"/utf8>>, fun bench_delete_all_matching/0},
{<<"Truncate (1000 rows)"/utf8>>, fun bench_truncate_table/0}],
Default
),
Transaction_suite = bench@bench:run_suite(
<<"Transaction Operations"/utf8>>,
[{<<"Transaction + commit"/utf8>>, fun bench_transaction_commit/0},
{<<"Transaction + rollback"/utf8>>,
fun bench_transaction_rollback/0},
{<<"Nested transaction (savepoint)"/utf8>>,
fun bench_nested_transaction/0}],
Default
),
Constraint_suite = bench@bench:run_suite(
<<"Constraint Checking"/utf8>>,
[{<<"Unique constraint check"/utf8>>,
fun bench_unique_constraint_check/0}],
Default
),
bench@bench:print_suite_summary(Insert_suite),
bench@bench:print_suite_summary(Batch_insert_suite),
bench@bench:print_suite_summary(Query_suite),
bench@bench:print_suite_summary(Large_query_suite),
bench@bench:print_suite_summary(Update_suite),
bench@bench:print_suite_summary(Delete_suite),
bench@bench:print_suite_summary(Transaction_suite),
bench@bench:print_suite_summary(Constraint_suite),
gleam_stdlib:println(<<""/utf8>>),
gleam_stdlib:println(<<"Markdown Output:"/utf8>>),
gleam_stdlib:println(
begin
_pipe = <<"-"/utf8>>,
gleam@string:repeat(_pipe, 60)
end
),
gleam_stdlib:println(bench@bench:to_markdown(Insert_suite)),
gleam_stdlib:println(bench@bench:to_markdown(Query_suite)),
gleam_stdlib:println(bench@bench:to_markdown(Update_suite)),
gleam_stdlib:println(bench@bench:to_markdown(Delete_suite)),
gleam_stdlib:println(bench@bench:to_markdown(Transaction_suite)).