~shimon/forgeperf

ref: 2d941cdd9f3d2e1b178f29c591ab8efc9374c254 forgeperf/index.html -rw-r--r-- 7.3 KiB
2d941cddDrew DeVault Updates folllowing lighthouse breaking changes 1 year, 11 months ago
                                                                                
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
<!doctype html>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Software Forge Performance Index</title>
<link rel="stylesheet" href="index.css" />
<article>
  <div style="float: right; text-align: right">
    <a href="/archives">Historical results »</a><br />
    <a href="https://git.sr.ht/~sircmpwn/forgeperf">Source code »</a>
  </div>
  <h1>Software Forge Performance Index</h1>
  <p>
    This webpage collects performance information about various hosted software
    development services. The reports are updated weekly, most recently on
    {{.LastUpdate}}, and were generated with
    <a href="https://github.com/GoogleChrome/lighthouse">Lighthouse</a>
    {{.LighthouseVersion}}.
    Patches welcome!
  </p>
  <p>
    <strong>Disclaimer</strong>: This website is maintained by SourceHut.
  </p>
  <details>
    <summary>Expand for details on methodology</summary>
    <p>
      We ran Lighthouse {{.LighthouseVersion}} on Alpine Linux x86_64, with the
      following command line:
    </p>
    <pre>lighthouse &lt;url&gt; \
    --only-categories=performance,accessibility \
    --profile=desktop \
    --throttling.cpuSlowdownMultiplier=1</pre>
    <p>
      The desktop profile is used because it's rare that a developer is coding
      on a mobile device &mdash; and some forges have separate mobile sites, so
      a separate test suite would be warranted.
    </p>
    <p>
      We left the throttling settings at the Lighthouse default, because it's
      less rare that a developer is tethered to their phone or working from a
      community with less privileged internet access. The simulated latency
      also helps to reduce the variable impact of real-world latency.
      Additionally, simulating a low-bandwidth connection helps to draw out the
      differences between services more clearly. This controls for network
      conditions; the same tests have been run from various datacenters with
      various degrees of favorability to each hosting provider with no
      discernible change in the results.
    </p>
    <p>
      CPU throttling is disabled to offset the effects of not having a GPU
      available in our testing environment. If you run these tests locally, it
      is recommended that you remove this constraint.
    </p>
    <p>
      The
      <a href="https://git.sr.ht/~sircmpwn/forgeperf">source code</a>
      is available if you wish to run these benchmarks on your own system; it
      takes about an hour.
    </p>
  </details>
  <div class="key">
    <span class="range">
      <span class="major red"></span> 0&ndash;49
    </span>
    <span class="range">
      <span class="major orange"></span> 50&ndash;89
    </span>
    <span class="range">
      <span class="major green"></span> 90&ndash;100
    </span>
  </div>
  <h2>All performance results</h2>
  <div class="table">
    <table class="all-results">
      <thead>
        <tr>
          <th class="wide"></th>
          <!-- XXX: Update width when adding new members -->
          {{range .Spec.Hosts}}
          <th style="width: 12%">{{.Name}}</th>
          {{end}}
        </tr>
      </thead>
      {{range .Spec.Categories}}
      <tbody>
        <tr>
          <th class="left" colspan="6">{{.Name}}</th>
        </tr>
        {{range .Tasks}}
        <tr>
          <td class="right">
            <a href="#{{.ID}}">{{.Name}}</a>
          </td>
          {{range .Reports | byhost}}
          {{if .Error }}
          <td class="red">0</td>
          {{else if not .RequestedURL}}
          <td class="grey">n/a</td>
          {{else}}
          <td class="{{. | overallClass}}">
            {{. | overallScore}}
          </td>
          {{end}}
          {{end}}
        </tr>
        {{end}}
      </tbody>
      {{end}}
    </table>
  </div>
  {{range .Spec.Categories}}
  <h2>{{.Name}}</h2>
  {{range .Tasks}}
  <h3 id="{{.ID}}">{{.Name}}</h3>
  <div class="table">
    <table>
      <thead>
        <tr>
          <td class="left" colspan="3">Page tested</td>
          <th>Performance</th>
          <th>Accessibility</th>
          <th>Speed Index</th>
          <th><abbr title="First Contentful Paint">FCP</abbr></th>
          <th><abbr title="First Meaningful Paint">FMP</abbr></th>
          <th><abbr title="First CPU Idle">First Idle</abbr></th>
          <th><abbr title="Time to Interactive">TTI</abbr></th>
          <th><abbr title="Maximum Potential First Input Delay">Max FID</abbr></th>
          <th>Full report</th>
        </tr>
      </thead>
      <tbody>
        {{$task := .}}
        {{range .Reports}}
        {{if .RequestedURL}}
        <tr>
          <td class="left wideish">
           <a
             href="{{.RequestedURL}}"
             rel="nofollow noopener"
             target="_blank"
           >{{.Host}}</a>
           {{if (index $task.Notes .Host) }}*{{end}}
          </td>
          {{if (or .Error (not .Audits.Diagnostics.Details.Items))}}
          <td class="right">n/a</td><td class="right">n/a</td>
          <td colspan="8" class="red">
            {{if .RuntimeError.Message}}
            {{.RuntimeError.Message}}
            {{else}}
            An error occured, see the <a href="{{.Log}}">log</a> for more details.
            {{end}}
          </td>
          <td class="wide">
            <a href="{{.HTMLData}}">HTML</a>
            <span></span>
            <a href="{{.RawData}}">JSON</a>
            <span></span>
            <a href="{{.Log}}">stderr</a>
          </td>
          {{else}}
          <td class="right wideish">
            {{(index .Audits.Diagnostics.Details.Items 0).NumRequests}} requests
          </td>
          <td class="right wideish">
            {{(index .Audits.Diagnostics.Details.Items 0).TotalByteWeight | kib}}
          </td>
          <td class="major {{.Categories.Performance.Score | class}}">
            {{.Categories.Performance.Score | score}}
          </td>
          <td class="major {{.Categories.Accessibility.Score | class}}">
            {{.Categories.Accessibility.Score | score}}
          </td>
          <td class="{{.Audits.SpeedIndex.Score | class}}">
            {{.Audits.SpeedIndex.DisplayValue}}
          </td>
          <td class="{{.Audits.FirstContentfulPaint.Score | class}}">
            {{.Audits.FirstContentfulPaint.DisplayValue}}
          </td>
          <td class="{{.Audits.FirstMeaningfulPaint.Score | class}}">
            {{.Audits.FirstMeaningfulPaint.DisplayValue}}
          </td>
          <td class="{{.Audits.FirstCPUIdle.Score | class}}">
            {{.Audits.FirstCPUIdle.DisplayValue}}
          </td>
          <td class="{{.Audits.TimeToInteractive.Score | class}}">
            {{.Audits.TimeToInteractive.DisplayValue}}
          </td>
          <td class="{{.Audits.MaxPotentialFID.Score | class}}">
            {{.Audits.MaxPotentialFID.DisplayValue}}
          </td>
          <td class="wide">
            <a href="{{.HTMLData}}">HTML</a><a href="{{.RawData}}">JSON</a><a href="{{.Log}}">stderr</a>
          </td>
        {{end}}
        </tr>
        {{end}}
        {{end}}
      </tbody>
    </table>
  </div>
  {{if .Notes}}
  <div class="notes">
    <strong>Notes</strong>
    <ul>
      {{range $host, $note := .Notes}}
      <li>* {{$host}}: {{$note}}</li>
      {{end}}
    </ul>
  </div>
  {{end}}
  {{end}}
  {{end}}
</article>