This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
We’ve analysed the runtime performance of Servo and Chromium in the cases of loading four websites, as of the versions below:
“chromium” — Google Chrome 128.0.6613.113 (Official Build), as shipped with NixOS 24.11.20240905.8ce7f9f
We found the newer versions of Servo (servo.2 and servo.3) to be significantly faster than the older version (servo.1), thanks to several performance improvements we landed last month. For example, taking the average change across the pages under test with a two-CPU configuration, First Contentful Paint times are 23% lower, and overall rendering times are 38% lower.
servo.3 continues to outperform Chromium in First Contentful Paint for three of the four pages under test. We still lag behind Chromium (chromium) in FCP for www.baidu.com, but are now only 81% slower, down from 97% slower.
servo.3 performs less favourably in overall rendering time, but improves over servo.1 and servo.2. We now outperform Chromium (chromium) in all CPU configurations for one of the four pages under test (zh.wikipedia.org), and outperform it for some CPU configurations in two others (servo.org and www.baidu.com).
All of the code and data used to write this report is in this file including:
perf-analysis-tools — our tooling
perf-analysis-tools/run-all-benchmarks.sh — how we ran the benchmarks
convert-pftrace-to-json.sh — converts Chrome tracing files to JSON
analyse-cpu-results.sh — computes summaries for each sample within a CPU configuration
generate-report-tables.sh — collates summaries into tables for this report
*/summary.txt — summary results (generated by our tooling)
Data for each engine under test
*.servo.1 — data for the first version of Servo (servo.1)
*.servo.2 — data for the second version of Servo (servo.2)
*.servo.3 — data for the third version of Servo (servo.3)
This report further automates the collection and analysis of data over our previous report, since there are now 64 configurations (four engines × four pages × four CPU configurations) that are each run 30 times. Changes to our procedures include:
Merging the mitmproxy recordings, so the replay only needs to be started once
Fixing intermittent xdotool failures caused by races in benchmark-servo.sh
Writing scripts to run benchmarks across the 64 configurations
Making those scripts set up the correct CPU isolation automatically
Making measurement resumable at sample boundaries (every 30 runs)
Note that the times in this report are not directly comparable with those in the previous report, due to some minor changes in measurement procedure, such as increasing the time we run each browser from 5 seconds to 10 seconds. The results for servo.1 are the best representation of how Servo performed at the time of the previous report.
That said, due to time constraints, our methodology is otherwise unchanged from the previous report. Notably, there are several unresolved limitations in our collection and interpretation of data, which we’ll discuss below.
The test scenarios in this report only cover cold page loads, without any caching or further user interaction.
Times are not cut off after the page is “fully loaded”, which may distort results due to layout operations after page load.
In § User-facing paint metrics, we don’t have Largest Contentful Paint (LCP) data, since this metric is not yet implemented in Servo.
In § Raw events, much of the LayoutPerform time in Servo is also recorded in ParseHTML, yielding unreasonable ParseHTML times, and ScriptEvaluate times in Servo are unreasonably small compared to similar events in Chromium.
In § Rendering phases model, the Rasterise phase for Chromium is incomplete, since it only includes Layerize events, and Parse and Script phase times are heavily distorted between Servo and Chromium.
Then we compute summaries for each sample within a CPU configuration:
$ for i in ?cpu; do ./analyse-cpu-results.sh $i; done
Then we collate those summaries and generate the tables:
$ ./generate-report-tables.sh
User-facing paint metrics
The paint metrics (FP and FCP) are standard web platform concepts that should be comparable between Chromium and Servo. In Chromium, their duration is measured from the markAsMainFrame event. In Servo, they are measured from the start of the first event associated with the page URL, which is always a ScriptParseHTML event.
The results are as follows.
FP (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
401.3ms
393.6ms
385.9ms
373.0ms
servo.2
321.3ms
359.7ms
359.6ms
302.8ms
servo.3
314.9ms
350.5ms
301.4ms
309.1ms
chromium
686.5ms
467.9ms
436.0ms
429.1ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
1.063s
1.178s
1.268s
1.174s
servo.2
973.5ms
1.090s
1.201s
1.209s
servo.3
974.1ms
1.139s
1.210s
1.211s
chromium
537.0ms
321.9ms
284.0ms
275.2ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
334.9ms
302.6ms
288.6ms
299.9ms
servo.2
146.4ms
124.3ms
134.0ms
127.2ms
servo.3
139.8ms
132.0ms
123.5ms
124.5ms
chromium
666.1ms
396.1ms
402.3ms
403.4ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
741.3ms
711.1ms
788.4ms
793.6ms
servo.2
692.4ms
712.0ms
686.0ms
689.3ms
servo.3
696.7ms
691.2ms
691.2ms
678.5ms
chromium
791.4ms
805.6ms
799.4ms
788.2ms
FCP (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
401.3ms
393.6ms
385.9ms
373.0ms
servo.2
321.3ms
359.7ms
359.6ms
302.8ms
servo.3
314.9ms
350.5ms
301.4ms
309.1ms
chromium
686.5ms
467.9ms
436.0ms
429.1ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
1.063s
1.178s
1.268s
1.174s
servo.2
973.5ms
1.090s
1.201s
1.209s
servo.3
974.1ms
1.139s
1.210s
1.211s
chromium
537.0ms
321.9ms
284.0ms
275.2ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
334.9ms
302.6ms
288.6ms
299.9ms
servo.2
146.4ms
124.3ms
134.0ms
127.2ms
servo.3
139.8ms
132.0ms
123.5ms
124.5ms
chromium
666.1ms
396.1ms
402.3ms
403.4ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
741.3ms
711.1ms
788.4ms
793.6ms
servo.2
692.4ms
712.0ms
686.0ms
689.3ms
servo.3
696.7ms
691.2ms
691.2ms
678.5ms
chromium
791.4ms
805.6ms
799.4ms
788.2ms
Raw events
For a detailed discussion of these events, see this section in our previous report.
The results are as follows, but the Servo and Chromium results are not comparable.
Compositing (real)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
53.92ms
53.27ms
52.92ms
53.66ms
servo.2
53.72ms
55.37ms
53.80ms
52.00ms
servo.3
51.15ms
55.20ms
54.44ms
51.60ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
26.51ms
76.70ms
76.55ms
74.21ms
servo.2
82.79ms
76.54ms
75.68ms
75.92ms
servo.3
84.53ms
79.57ms
77.20ms
74.21ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
41.18ms
40.38ms
40.17ms
39.61ms
servo.2
40.96ms
41.86ms
40.79ms
40.04ms
servo.3
26.82ms
42.33ms
40.70ms
40.14ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
8.364ms
6.094ms
6.065ms
3.165ms
servo.2
5.268ms
30.14ms
4.472ms
29.48ms
servo.3
9.122ms
30.11ms
7.166ms
29.94ms
LayoutPerform (real)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
128.5ms
118.0ms
116.3ms
116.2ms
servo.2
57.93ms
51.04ms
49.21ms
48.93ms
servo.3
28.65ms
21.55ms
20.57ms
19.79ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
5.666s
4.871s
4.844s
3.760s
servo.2
5.971s
5.724s
4.105s
3.424s
servo.3
5.311s
5.010s
4.312s
3.346s
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
262.5ms
238.1ms
228.8ms
228.7ms
servo.2
163.9ms
160.1ms
140.7ms
147.9ms
servo.3
149.4ms
168.2ms
149.3ms
199.1ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
179.3ms
161.4ms
162.8ms
150.5ms
servo.2
50.05ms
106.5ms
40.26ms
52.91ms
servo.3
30.84ms
39.48ms
38.87ms
54.77ms
ScriptEvaluate (real)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
356.9μs
354.2μs
354.2μs
355.0μs
servo.2
352.2μs
361.2μs
359.5μs
359.7μs
servo.3
356.5μs
359.2μs
355.9μs
356.1μs
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
229.8ms
181.2ms
202.7ms
182.0ms
servo.2
196.7ms
152.8ms
177.0ms
151.0ms
servo.3
187.2ms
149.1ms
180.6ms
141.3ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
654.2μs
675.0μs
663.1μs
658.3μs
servo.2
637.0μs
674.9μs
639.7μs
636.4μs
servo.3
731.9μs
677.6μs
648.4μs
636.1μs
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
9.680ms
9.287ms
9.204ms
9.166ms
servo.2
9.629ms
9.133ms
9.168ms
9.022ms
servo.3
9.764ms
9.211ms
9.167ms
9.074ms
ScriptParseHTML (real)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
90.71ms
86.90ms
86.40ms
86.17ms
servo.2
22.59ms
20.51ms
20.03ms
19.89ms
servo.3
16.15ms
14.28ms
13.96ms
13.64ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
825.2ms
831.2ms
805.1ms
808.7ms
servo.2
837.2ms
780.5ms
724.0ms
731.0ms
servo.3
744.0ms
676.7ms
736.3ms
704.1ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
250.6ms
226.0ms
219.3ms
213.1ms
servo.2
45.03ms
36.73ms
37.76ms
35.55ms
servo.3
43.08ms
36.81ms
35.29ms
35.99ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
84.62ms
83.58ms
83.57ms
83.41ms
servo.2
86.24ms
85.47ms
85.62ms
85.30ms
servo.3
83.20ms
83.02ms
82.92ms
82.61ms
EvaluateScript (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
4.919ms
4.415ms
4.408ms
4.384ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
166.1ms
107.2ms
99.11ms
96.07ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
9.789ms
6.957ms
6.893ms
6.982ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
73.95ms
129.1ms
46.14ms
124.0ms
FunctionCall (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
1.116ms
1.102ms
1.110ms
1.100ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
912.5ms
651.6ms
611.6ms
611.4ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
118.6ms
90.91ms
89.47ms
88.44ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
28.56ms
70.39ms
12.72ms
68.94ms
Layerize (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
228.0μs
269.0μs
261.0μs
268.0μs
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
9.156ms
9.024ms
9.179ms
8.352ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
3.358ms
3.146ms
3.171ms
2.895ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
472.0μs
372.0μs
322.0μs
403.0μs
Layout (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
50.03ms
42.30ms
41.29ms
40.29ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
152.3ms
105.2ms
99.62ms
96.77ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
140.6ms
124.5ms
123.5ms
123.0ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
26.51ms
24.25ms
22.96ms
23.41ms
Paint (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
918.0μs
1.139ms
1.137ms
1.151ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
22.33ms
20.18ms
16.53ms
17.70ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
12.52ms
13.06ms
13.13ms
12.97ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
855.0μs
878.0μs
724.0μs
880.0μs
ParseHTML (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
7.442ms
5.406ms
5.400ms
5.573ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
190.1ms
133.3ms
122.6ms
117.2ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
8.332ms
5.448ms
5.090ms
5.113ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
34.92ms
26.98ms
24.57ms
24.79ms
PrePaint (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
624.0μs
762.0μs
743.0μs
748.0μs
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
21.91ms
18.63ms
16.29ms
17.02ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
4.945ms
4.943ms
4.938ms
4.457ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
746.0μs
754.0μs
563.0μs
763.0μs
TimerFire (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
444.0μs
451.0μs
450.0μs
455.0μs
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
575.7ms
418.3ms
402.6ms
393.1ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
29.84ms
25.52ms
24.89ms
23.27ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
8.511ms
6.742ms
4.359ms
6.372ms
UpdateLayoutTree (real)
servo.org
2cpu
4cpu
6cpu
8cpu
chromium
14.87ms
14.85ms
14.44ms
14.72ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
chromium
129.6ms
86.65ms
84.23ms
83.08ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
chromium
24.13ms
18.37ms
18.53ms
17.83ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
chromium
4.689ms
6.415ms
4.720ms
6.196ms
Rendering phases model
For a detailed discussion of this model, see this section in our previous report.
The results are as follows, but we do not consider them very meaningful.
Parse (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
90.71ms
86.90ms
86.40ms
86.17ms
servo.2
22.59ms
20.51ms
20.03ms
19.89ms
servo.3
16.15ms
14.28ms
13.96ms
13.64ms
chromium
7.318ms
5.303ms
5.296ms
5.475ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
825.2ms
831.2ms
805.1ms
808.7ms
servo.2
837.2ms
780.5ms
724.0ms
731.0ms
servo.3
744.0ms
676.7ms
736.3ms
704.1ms
chromium
190.1ms
133.3ms
122.6ms
117.2ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
250.6ms
226.0ms
219.3ms
213.1ms
servo.2
45.03ms
36.73ms
37.76ms
35.55ms
servo.3
43.08ms
36.81ms
35.29ms
35.99ms
chromium
8.332ms
5.448ms
5.090ms
5.113ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
84.62ms
83.58ms
83.57ms
83.41ms
servo.2
86.24ms
85.47ms
85.62ms
85.30ms
servo.3
83.20ms
83.02ms
82.92ms
82.61ms
chromium
34.92ms
26.98ms
24.57ms
24.79ms
Script (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
356.9μs
354.2μs
354.2μs
355.0μs
servo.2
352.2μs
361.2μs
359.5μs
359.7μs
servo.3
356.5μs
359.2μs
355.9μs
356.1μs
chromium
6.171ms
5.588ms
5.556ms
5.537ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
229.8ms
181.2ms
202.7ms
182.0ms
servo.2
196.7ms
152.8ms
177.0ms
151.0ms
servo.3
187.2ms
149.1ms
180.6ms
141.3ms
chromium
1.145s
831.6ms
762.2ms
761.7ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
654.2μs
675.0μs
663.1μs
658.3μs
servo.2
637.0μs
674.9μs
639.7μs
636.4μs
servo.3
731.9μs
677.6μs
648.4μs
636.1μs
chromium
130.6ms
100.9ms
98.53ms
97.29ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
9.680ms
9.287ms
9.204ms
9.166ms
servo.2
9.629ms
9.133ms
9.168ms
9.022ms
servo.3
9.764ms
9.211ms
9.167ms
9.074ms
chromium
103.6ms
206.2ms
59.76ms
195.8ms
Layout (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
128.5ms
118.0ms
116.3ms
116.2ms
servo.2
57.93ms
51.04ms
49.21ms
48.93ms
servo.3
28.65ms
21.55ms
20.57ms
19.79ms
chromium
80.82ms
59.30ms
58.29ms
57.53ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
5.666s
4.871s
4.844s
3.760s
servo.2
5.971s
5.724s
4.105s
3.424s
servo.3
5.311s
5.010s
4.312s
3.346s
chromium
380.6ms
243.1ms
222.8ms
214.6ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
262.5ms
238.1ms
228.8ms
228.7ms
servo.2
163.9ms
160.1ms
140.7ms
147.9ms
servo.3
149.4ms
168.2ms
149.3ms
199.1ms
chromium
189.1ms
162.6ms
161.7ms
160.3ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
179.3ms
161.4ms
162.8ms
150.5ms
servo.2
50.05ms
106.5ms
40.26ms
52.91ms
servo.3
30.84ms
39.48ms
38.87ms
54.77ms
chromium
33.17ms
32.69ms
28.97ms
31.56ms
Rasterise (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
53.92ms
53.27ms
52.92ms
53.66ms
servo.2
53.72ms
55.37ms
53.80ms
52.00ms
servo.3
51.15ms
55.20ms
54.44ms
51.60ms
chromium
228.0μs
269.0μs
261.0μs
268.0μs
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
26.51ms
76.70ms
76.55ms
74.21ms
servo.2
82.79ms
76.54ms
75.68ms
75.92ms
servo.3
84.53ms
79.57ms
77.20ms
74.21ms
chromium
9.156ms
9.024ms
9.179ms
8.352ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
41.18ms
40.38ms
40.17ms
39.61ms
servo.2
40.96ms
41.86ms
40.79ms
40.04ms
servo.3
26.82ms
42.33ms
40.70ms
40.14ms
chromium
3.358ms
3.146ms
3.171ms
2.895ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
8.364ms
6.094ms
6.065ms
3.165ms
servo.2
5.268ms
30.14ms
4.472ms
29.48ms
servo.3
9.122ms
30.11ms
7.166ms
29.94ms
chromium
472.0μs
372.0μs
322.0μs
403.0μs
Overall rendering time model
To make the most of the data we have, we can take the union of all of the events above and call that the Renderer. Whenever Servo or Chromium is recording time in Renderer, they are busy with some phase of the rendering process for the page under test (or a generic task, like Compositing in Servo).
The results are as follows.
Renderer (synthetic)
servo.org
2cpu
4cpu
6cpu
8cpu
servo.1
193.5ms
176.5ms
173.8ms
172.9ms
servo.2
115.4ms
111.1ms
107.1ms
106.9ms
servo.3
85.27ms
80.83ms
79.96ms
76.73ms
chromium
97.99ms
68.00ms
66.68ms
65.99ms
www.amazon.com
2cpu
4cpu
6cpu
8cpu
servo.1
6.292s
5.322s
5.236s
4.151s
servo.2
6.413s
6.133s
4.665s
3.895s
servo.3
5.799s
5.607s
4.963s
3.783s
chromium
1.481s
1.035s
983.9ms
971.4ms
zh.wikipedia.org
2cpu
4cpu
6cpu
8cpu
servo.1
334.7ms
306.4ms
296.1ms
294.4ms
servo.2
176.5ms
175.9ms
156.5ms
163.5ms
servo.3
202.7ms
183.6ms
165.5ms
214.5ms
chromium
347.5ms
267.2ms
265.8ms
262.3ms
www.baidu.com
2cpu
4cpu
6cpu
8cpu
servo.1
279.2ms
251.4ms
252.6ms
236.7ms
servo.2
145.3ms
214.2ms
133.4ms
169.1ms
servo.3
141.9ms
153.4ms
153.5ms
167.8ms
chromium
139.9ms
245.2ms
97.19ms
232.6ms
Delete Page
Deleting the wiki page "Servo Benchmarking Report (November 2024)" cannot be undone. Continue?