|
|
@@ -0,0 +1,76 @@ |
|
|
|
defmodule Mix.Tasks.Pleroma.Benchmarks.Timelines do |
|
|
|
use Mix.Task |
|
|
|
alias Pleroma.Repo |
|
|
|
alias Pleroma.LoadTesting.Generator |
|
|
|
|
|
|
|
alias Pleroma.Web.CommonAPI |
|
|
|
|
|
|
|
def run(_args) do |
|
|
|
Mix.Pleroma.start_pleroma() |
|
|
|
|
|
|
|
# Cleaning tables |
|
|
|
clean_tables() |
|
|
|
|
|
|
|
[{:ok, user} | users] = Generator.generate_users(users_max: 1000) |
|
|
|
|
|
|
|
# Let the user make 100 posts |
|
|
|
|
|
|
|
1..100 |
|
|
|
|> Enum.each(fn i -> CommonAPI.post(user, %{"status" => to_string(i)}) end) |
|
|
|
|
|
|
|
# Let 10 random users post |
|
|
|
posts = |
|
|
|
users |
|
|
|
|> Enum.take_random(10) |
|
|
|
|> Enum.map(fn {:ok, random_user} -> |
|
|
|
{:ok, activity} = CommonAPI.post(random_user, %{"status" => "."}) |
|
|
|
activity |
|
|
|
end) |
|
|
|
|
|
|
|
# let our user repeat them |
|
|
|
posts |
|
|
|
|> Enum.each(fn activity -> |
|
|
|
CommonAPI.repeat(activity.id, user) |
|
|
|
end) |
|
|
|
|
|
|
|
Benchee.run( |
|
|
|
%{ |
|
|
|
"user timeline, no followers" => fn reading_user -> |
|
|
|
conn = |
|
|
|
Phoenix.ConnTest.build_conn() |
|
|
|
|> Plug.Conn.assign(:user, reading_user) |
|
|
|
|> Plug.Conn.assign(:skip_link_headers, true) |
|
|
|
|
|
|
|
Pleroma.Web.MastodonAPI.AccountController.statuses(conn, %{"id" => user.id}) |
|
|
|
end |
|
|
|
}, |
|
|
|
inputs: %{"user" => user, "no user" => nil}, |
|
|
|
time: 60 |
|
|
|
) |
|
|
|
|
|
|
|
users |
|
|
|
|> Enum.each(fn {:ok, follower} -> Pleroma.User.follow(follower, user) end) |
|
|
|
|
|
|
|
Benchee.run( |
|
|
|
%{ |
|
|
|
"user timeline, all following" => fn reading_user -> |
|
|
|
conn = |
|
|
|
Phoenix.ConnTest.build_conn() |
|
|
|
|> Plug.Conn.assign(:user, reading_user) |
|
|
|
|> Plug.Conn.assign(:skip_link_headers, true) |
|
|
|
|
|
|
|
Pleroma.Web.MastodonAPI.AccountController.statuses(conn, %{"id" => user.id}) |
|
|
|
end |
|
|
|
}, |
|
|
|
inputs: %{"user" => user, "no user" => nil}, |
|
|
|
time: 60 |
|
|
|
) |
|
|
|
end |
|
|
|
|
|
|
|
defp clean_tables do |
|
|
|
IO.puts("Deleting old data...\n") |
|
|
|
Ecto.Adapters.SQL.query!(Repo, "TRUNCATE users CASCADE;") |
|
|
|
Ecto.Adapters.SQL.query!(Repo, "TRUNCATE activities CASCADE;") |
|
|
|
Ecto.Adapters.SQL.query!(Repo, "TRUNCATE objects CASCADE;") |
|
|
|
end |
|
|
|
end |