summaryrefslogtreecommitdiff
path: root/lib/mix/tasks/pleroma/benchmark.ex
blob: dd2b9c8f278b26d28506b14a413d341a704c6417 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Mix.Tasks.Pleroma.Benchmark do
  import Mix.Pleroma
  use Mix.Task

  def run(["search"]) do
    start_pleroma()

    Benchee.run(%{
      "search" => fn ->
        Pleroma.Activity.search(nil, "cofe")
      end
    })
  end

  def run(["tag"]) do
    start_pleroma()

    Benchee.run(%{
      "tag" => fn ->
        %{"type" => "Create", "tag" => "cofe"}
        |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
      end
    })
  end

  def run(["render_timeline", nickname | _] = args) do
    start_pleroma()
    user = Pleroma.User.get_by_nickname(nickname)

    activities =
      %{}
      |> Map.put("type", ["Create", "Announce"])
      |> Map.put("blocking_user", user)
      |> Map.put("muting_user", user)
      |> Map.put("user", user)
      |> Map.put("limit", 4096)
      |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
      |> Enum.reverse()

    inputs = %{
      "1 activity" => Enum.take_random(activities, 1),
      "10 activities" => Enum.take_random(activities, 10),
      "20 activities" => Enum.take_random(activities, 20),
      "40 activities" => Enum.take_random(activities, 40),
      "80 activities" => Enum.take_random(activities, 80)
    }

    inputs =
      if Enum.at(args, 2) == "extended" do
        Map.merge(inputs, %{
          "200 activities" => Enum.take_random(activities, 200),
          "500 activities" => Enum.take_random(activities, 500),
          "2000 activities" => Enum.take_random(activities, 2000),
          "4096 activities" => Enum.take_random(activities, 4096)
        })
      else
        inputs
      end

    Benchee.run(
      %{
        "Standart rendering" => fn activities ->
          Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{
            activities: activities,
            for: user,
            as: :activity
          })
        end
      },
      inputs: inputs
    )
  end

  def run(["adapters"]) do
    start_pleroma()

    :ok =
      Pleroma.Gun.Conn.open(
        "https://httpbin.org/stream-bytes/1500",
        :gun_connections
      )

    Process.sleep(1_500)

    Benchee.run(
      %{
        "Without conn and without pool" => fn ->
          {:ok, %Tesla.Env{}} =
            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [],
              adapter: [pool: :no_pool, receive_conn: false]
            )
        end,
        "Without conn and with pool" => fn ->
          {:ok, %Tesla.Env{}} =
            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [],
              adapter: [receive_conn: false]
            )
        end,
        "With reused conn and without pool" => fn ->
          {:ok, %Tesla.Env{}} =
            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [],
              adapter: [pool: :no_pool]
            )
        end,
        "With reused conn and with pool" => fn ->
          {:ok, %Tesla.Env{}} = Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500")
        end
      },
      parallel: 10
    )
  end
end