2023-10-18 04:47:42 +13:00
|
|
|
alias AshPostgres.Test.{Api, Post}
|
|
|
|
|
|
|
|
ten_rows =
|
|
|
|
1..10
|
|
|
|
|> Enum.map(fn i ->
|
|
|
|
%{
|
|
|
|
title: "Title: #{i}"
|
|
|
|
}
|
|
|
|
end)
|
|
|
|
|
|
|
|
thousand_rows =
|
|
|
|
1..1000
|
|
|
|
|> Enum.map(fn i ->
|
|
|
|
%{
|
|
|
|
title: "Title: #{i}"
|
|
|
|
}
|
|
|
|
end)
|
|
|
|
|
|
|
|
hundred_thousand_rows =
|
|
|
|
1..1000
|
|
|
|
|> Enum.map(fn i ->
|
|
|
|
%{
|
|
|
|
title: "Title: #{i}"
|
|
|
|
}
|
|
|
|
end)
|
|
|
|
|
2023-10-19 09:41:23 +13:00
|
|
|
# do them both once to warm things up
|
2023-10-18 04:47:42 +13:00
|
|
|
Api.bulk_create(ten_rows, Post, :create,
|
|
|
|
batch_size: 10,
|
2023-10-19 09:41:23 +13:00
|
|
|
max_concurrency: 2
|
2023-10-18 04:47:42 +13:00
|
|
|
)
|
|
|
|
|
2023-10-19 09:41:23 +13:00
|
|
|
# do them both once to warm things up
|
2023-10-18 04:47:42 +13:00
|
|
|
AshPostgres.TestRepo.insert_all(Post, ten_rows)
|
|
|
|
|
2023-10-19 09:41:23 +13:00
|
|
|
max_concurrency = 16
|
|
|
|
batch_size = 200
|
|
|
|
|
2023-10-18 04:47:42 +13:00
|
|
|
Benchee.run(
|
|
|
|
%{
|
|
|
|
"ash sync": fn input ->
|
|
|
|
%{error_count: 0} = Api.bulk_create(input, Post, :create,
|
2023-10-19 09:41:23 +13:00
|
|
|
batch_size: batch_size,
|
2023-10-18 04:47:42 +13:00
|
|
|
transaction: false
|
|
|
|
)
|
|
|
|
end,
|
2023-10-19 09:41:23 +13:00
|
|
|
"ash sync assuming casted": fn input ->
|
|
|
|
%{error_count: 0} = Api.bulk_create(input, Post, :create,
|
|
|
|
batch_size: batch_size,
|
|
|
|
transaction: false,
|
|
|
|
assume_casted?: true
|
|
|
|
)
|
|
|
|
end,
|
2023-10-18 04:47:42 +13:00
|
|
|
"ecto sync": fn input ->
|
|
|
|
input
|
2023-10-19 09:41:23 +13:00
|
|
|
|> Stream.chunk_every(batch_size)
|
2023-10-18 04:47:42 +13:00
|
|
|
|> Enum.each(fn batch ->
|
|
|
|
AshPostgres.TestRepo.insert_all(Post, batch)
|
|
|
|
end)
|
|
|
|
end,
|
2023-10-19 09:41:23 +13:00
|
|
|
"ash async stream": fn input ->
|
|
|
|
input
|
|
|
|
|> Stream.chunk_every(batch_size)
|
|
|
|
|> Task.async_stream(fn batch ->
|
|
|
|
%{error_count: 0} = Api.bulk_create(batch, Post, :create,
|
|
|
|
transaction: false
|
|
|
|
)
|
|
|
|
end, max_concurrency: max_concurrency, timeout: :infinity)
|
|
|
|
|> Stream.run()
|
|
|
|
end,
|
|
|
|
"ash async stream assuming casted": fn input ->
|
|
|
|
input
|
|
|
|
|> Stream.chunk_every(batch_size)
|
|
|
|
|> Task.async_stream(fn batch ->
|
|
|
|
%{error_count: 0} = Api.bulk_create(batch, Post, :create,
|
|
|
|
transaction: false,
|
|
|
|
assume_casted?: true
|
|
|
|
)
|
|
|
|
end, max_concurrency: max_concurrency, timeout: :infinity)
|
|
|
|
|> Stream.run()
|
|
|
|
end,
|
|
|
|
"ash using own async option": fn input ->
|
2023-10-18 04:47:42 +13:00
|
|
|
%{error_count: 0} = Api.bulk_create(input, Post, :create,
|
2023-10-19 09:41:23 +13:00
|
|
|
transaction: false,
|
|
|
|
max_concurrency: max_concurrency,
|
|
|
|
batch_size: batch_size
|
|
|
|
)
|
|
|
|
end,
|
|
|
|
"ash using own async option assuming casted": fn input ->
|
|
|
|
%{error_count: 0} = Api.bulk_create(input, Post, :create,
|
|
|
|
transaction: false,
|
|
|
|
assume_casted?: true,
|
|
|
|
max_concurrency: max_concurrency,
|
|
|
|
batch_size: batch_size
|
2023-10-18 04:47:42 +13:00
|
|
|
)
|
|
|
|
end,
|
2023-10-19 09:41:23 +13:00
|
|
|
"ecto async stream": fn input ->
|
2023-10-18 04:47:42 +13:00
|
|
|
input
|
2023-10-19 09:41:23 +13:00
|
|
|
|> Stream.chunk_every(batch_size)
|
2023-10-18 04:47:42 +13:00
|
|
|
|> Task.async_stream(fn batch ->
|
|
|
|
AshPostgres.TestRepo.insert_all(Post, batch)
|
2023-10-19 09:41:23 +13:00
|
|
|
end, max_concurrency: max_concurrency, timeout: :infinity)
|
2023-10-18 04:47:42 +13:00
|
|
|
|> Stream.run()
|
|
|
|
end
|
|
|
|
},
|
2023-10-19 09:41:23 +13:00
|
|
|
after_scenario: fn _ ->
|
|
|
|
AshPostgres.TestRepo.query!("TRUNCATE posts CASCADE")
|
|
|
|
end,
|
2023-10-18 04:47:42 +13:00
|
|
|
inputs: %{
|
2023-10-19 09:56:09 +13:00
|
|
|
"10 rows" => ten_rows,
|
2023-10-19 09:41:23 +13:00
|
|
|
"1000 rows" => thousand_rows
|
2023-10-18 04:47:42 +13:00
|
|
|
}
|
|
|
|
)
|