First
[anni] / lib / mix / tasks / pleroma / benchmark.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Mix.Tasks.Pleroma.Benchmark do
6   import Mix.Pleroma
7   use Mix.Task
8
9   def run(["search"]) do
10     start_pleroma()
11
12     Benchee.run(%{
13       "search" => fn ->
14         Pleroma.Activity.search(nil, "cofe")
15       end
16     })
17   end
18
19   def run(["tag"]) do
20     start_pleroma()
21
22     Benchee.run(%{
23       "tag" => fn ->
24         %{"type" => "Create", "tag" => "cofe"}
25         |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
26       end
27     })
28   end
29
30   def run(["render_timeline", nickname | _] = args) do
31     start_pleroma()
32     user = Pleroma.User.get_by_nickname(nickname)
33
34     activities =
35       %{}
36       |> Map.put("type", ["Create", "Announce"])
37       |> Map.put("blocking_user", user)
38       |> Map.put("muting_user", user)
39       |> Map.put("user", user)
40       |> Map.put("limit", 4096)
41       |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
42       |> Enum.reverse()
43
44     inputs = %{
45       "1 activity" => Enum.take_random(activities, 1),
46       "10 activities" => Enum.take_random(activities, 10),
47       "20 activities" => Enum.take_random(activities, 20),
48       "40 activities" => Enum.take_random(activities, 40),
49       "80 activities" => Enum.take_random(activities, 80)
50     }
51
52     inputs =
53       if Enum.at(args, 2) == "extended" do
54         Map.merge(inputs, %{
55           "200 activities" => Enum.take_random(activities, 200),
56           "500 activities" => Enum.take_random(activities, 500),
57           "2000 activities" => Enum.take_random(activities, 2000),
58           "4096 activities" => Enum.take_random(activities, 4096)
59         })
60       else
61         inputs
62       end
63
64     Benchee.run(
65       %{
66         "Standart rendering" => fn activities ->
67           Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{
68             activities: activities,
69             for: user,
70             as: :activity
71           })
72         end
73       },
74       inputs: inputs
75     )
76   end
77
78   def run(["adapters"]) do
79     start_pleroma()
80
81     :ok =
82       Pleroma.Gun.Conn.open(
83         "https://httpbin.org/stream-bytes/1500",
84         :gun_connections
85       )
86
87     Process.sleep(1_500)
88
89     Benchee.run(
90       %{
91         "Without conn and without pool" => fn ->
92           {:ok, %Tesla.Env{}} =
93             Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [],
94               pool: :no_pool,
95               receive_conn: false
96             )
97         end,
98         "Without conn and with pool" => fn ->
99           {:ok, %Tesla.Env{}} =
100             Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], receive_conn: false)
101         end,
102         "With reused conn and without pool" => fn ->
103           {:ok, %Tesla.Env{}} =
104             Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], pool: :no_pool)
105         end,
106         "With reused conn and with pool" => fn ->
107           {:ok, %Tesla.Env{}} = Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500")
108         end
109       },
110       parallel: 10
111     )
112   end
113 end