71 lines
1.7 KiB
Elixir
71 lines
1.7 KiB
Elixir
defmodule Mix.Tasks.Pleroma.Benchmarks.Timelines do
|
|
use Mix.Task
|
|
|
|
import Pleroma.LoadTesting.Helper, only: [clean_tables: 0]
|
|
|
|
alias Pleroma.Web.CommonAPI
|
|
alias Plug.Conn
|
|
|
|
def run(_args) do
|
|
Mix.Pleroma.start_pleroma()
|
|
|
|
# Cleaning tables
|
|
clean_tables()
|
|
|
|
[{:ok, user} | users] = Pleroma.LoadTesting.Users.generate_users(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()
|
|
|> Conn.assign(:user, reading_user)
|
|
|> 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()
|
|
|> Conn.assign(:user, reading_user)
|
|
|> 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
|
|
end
|