-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Servo Benchmarking Report (November 2024)
We’ve analysed the runtime performance of Servo and Chromium in the cases of loading four websites, as of the versions below:
- “servo.1” — f8933a57353aeca14a6cbc60b3cb0cf98cab6c5d (2024-10-06)
- “servo.2” — 7015e0fb5f1a63ed13a5b07b056036e6e7adbc16 (2024-10-22)
- “servo.3” — bac1101163a436096fe0b71bed79094658bba3b2 (2024-10-30)
- “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) -
*.chromium— data for Chromium (chromium) -
*/*.html— Servo HTML traces -
*/*.pftrace— Chrome tracing files
-
- Data for each page under test
-
servo.org.*— data for https://servo.org/ -
www.amazon.com.*— data for https://www.amazon.com/dp/B07S9XZYN2 -
zh.wikipedia.org.*— data for https://zh.wikipedia.org/wiki/Servo -
www.baidu.com.*— data for https://www.baidu.com/
-
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
- Parameterising our CPU isolation script over Linux cpu ids
- 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.
Our test environment is as follows:
- AMD 7950X (amd64)
- NixOS 24.11.20240905.8ce7f9f running X11
- Linux 6.11.0-rc6,
linuxPackages_testingfrom NixOS (as above) - Servo is built with
./mach build --profile production-stripped - Chromium is
google-chromefrom NixOS (as above)NIXPKGS_ALLOW_UNFREE=1 nix run --impure github:NixOS/nixpkgs/8ce7f9f78bdbe659a8d7c1fe376b89b3a43e4cdc\#google-chrome
- servo/perf-analysis-tools as of 01d5b4152dae0
The workloads are run in a shell created as follows:
$ newgrp mitmproxy
$ nix-shell ~/path/to/servo/shell.nix --run zsh
CPU isolation is handled in § Measurement procedure.
To ensure that the windows are kept offscreen, we use the following i3 config:
$ cat ~/.config/i3/config
for_window [instance="^servo$" class="^servo$"] floating enable
for_window [instance="^google-chrome [(]" class="^Google-chrome$"] floating enable
assign [instance="^servo$" class="^servo$"] 7
assign [instance="^google-chrome [(]" class="^Google-chrome$"] 7
To ensure that the benchmarking scripts can set up the CPU isolation automatically, we use the following sudoers(5) config:
$ cat /etc/sudoers
%wheel ALL=(ALL:ALL) NOPASSWD: /path/to/perf-analysis-tools/isolate-cpu-for-shell.sh
We run the benchmarks as follows:
$ cd perf-analysis-tools
$ cat run-all-benchmarks.sh
#!/usr/bin/env zsh
set -euo pipefail -o bsdecho
sudo ./isolate-cpu-for-shell.sh $$ 14 15
./run-benchmarks-for-cpu.sh ../report3/2cpu
sudo ./isolate-cpu-for-shell.sh $$ {12..15}
./run-benchmarks-for-cpu.sh ../report3/4cpu
sudo ./isolate-cpu-for-shell.sh $$ {10..15}
./run-benchmarks-for-cpu.sh ../report3/6cpu
sudo ./isolate-cpu-for-shell.sh $$ {8..15}
./run-benchmarks-for-cpu.sh ../report3/8cpu
$ ./run-all-benchmarks.sh
This in turn sets up the CPU isolation for each CPU configuration and runs the benchmarks:
$ cat run-benchmarks-for-cpu.sh
#!/usr/bin/env zsh
set -euo pipefail -o bsdecho
sample_dir=$1
./run-benchmarks-for-site.sh servo.org https://servo.org/ "$sample_dir"
./run-benchmarks-for-site.sh www.amazon.com https://www.amazon.com/dp/B07S9XZYN2 "$sample_dir"
./run-benchmarks-for-site.sh zh.wikipedia.org https://zh.wikipedia.org/wiki/Servo "$sample_dir"
./run-benchmarks-for-site.sh www.baidu.com https://www.baidu.com/ "$sample_dir"
This in turn runs the benchmarks for each site:
#!/usr/bin/env zsh
set -euo pipefail -o bsdecho
key=$1
url=$2
sample_dir=$3
./benchmark-servo.sh ~/code/servo/servo.20241006.f8933a57353aeca14a6cbc60b3cb0cf98cab6c5d/servo "$url" 30 "$sample_dir/$key.servo.1"
./benchmark-servo.sh ~/code/servo/servo.20241022.7015e0fb5f1a63ed13a5b07b056036e6e7adbc16/servo "$url" 30 "$sample_dir/$key.servo.2"
./benchmark-servo.sh ~/code/servo/servo.20241030.bac1101163a436096fe0b71bed79094658bba3b2/servo "$url" 30 "$sample_dir/$key.servo.3"
./benchmark-chromium.sh google-chrome-stable "$url" 30 "$sample_dir/$key.chromium"
This in turn runs the benchmarks for each engine.
We first convert the Chromium traces from Perfetto format to JSON format:
$ ./convert-pftrace-to-json.sh /path/to/traceconv
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
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.
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
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.
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 4.919ms | 4.415ms | 4.408ms | 4.384ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 166.1ms | 107.2ms | 99.11ms | 96.07ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 9.789ms | 6.957ms | 6.893ms | 6.982ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 73.95ms | 129.1ms | 46.14ms | 124.0ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 1.116ms | 1.102ms | 1.110ms | 1.100ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 912.5ms | 651.6ms | 611.6ms | 611.4ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 118.6ms | 90.91ms | 89.47ms | 88.44ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 28.56ms | 70.39ms | 12.72ms | 68.94ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 228.0μs | 269.0μs | 261.0μs | 268.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 9.156ms | 9.024ms | 9.179ms | 8.352ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 3.358ms | 3.146ms | 3.171ms | 2.895ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 472.0μs | 372.0μs | 322.0μs | 403.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 50.03ms | 42.30ms | 41.29ms | 40.29ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 152.3ms | 105.2ms | 99.62ms | 96.77ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 140.6ms | 124.5ms | 123.5ms | 123.0ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 26.51ms | 24.25ms | 22.96ms | 23.41ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 918.0μs | 1.139ms | 1.137ms | 1.151ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 22.33ms | 20.18ms | 16.53ms | 17.70ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 12.52ms | 13.06ms | 13.13ms | 12.97ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 855.0μs | 878.0μs | 724.0μs | 880.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 7.442ms | 5.406ms | 5.400ms | 5.573ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 190.1ms | 133.3ms | 122.6ms | 117.2ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 8.332ms | 5.448ms | 5.090ms | 5.113ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 34.92ms | 26.98ms | 24.57ms | 24.79ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 624.0μs | 762.0μs | 743.0μs | 748.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 21.91ms | 18.63ms | 16.29ms | 17.02ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 4.945ms | 4.943ms | 4.938ms | 4.457ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 746.0μs | 754.0μs | 563.0μs | 763.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 444.0μs | 451.0μs | 450.0μs | 455.0μs |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 575.7ms | 418.3ms | 402.6ms | 393.1ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 29.84ms | 25.52ms | 24.89ms | 23.27ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 8.511ms | 6.742ms | 4.359ms | 6.372ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 14.87ms | 14.85ms | 14.44ms | 14.72ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 129.6ms | 86.65ms | 84.23ms | 83.08ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 24.13ms | 18.37ms | 18.53ms | 17.83ms |
| 2cpu | 4cpu | 6cpu | 8cpu | |
|---|---|---|---|---|
| chromium | 4.689ms | 6.415ms | 4.720ms | 6.196ms |
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.
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
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.
| 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 |
| 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 |
| 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 |
| 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 |