rsvg-bench¶
The rsvg-bench program is a small utility for benchmarking librsvg.
Goals¶
To benchmark librsvg, we would like to do several things:
Be able to process many SVG images with a single command. For example, this lets us answer a question like, “how long does version N of librsvg take to render a directory full of SVG icons?” — which is important for the performance of an application chooser.
Be able to repeatedly process SVG files, for example, “render this SVG 1000 times in a row”. This is useful to get accurate timings, as a single render may only take a few microseconds and may be hard to measure. It also helps with running profilers, as they will be able to get more useful samples if the SVG rendering process runs repeatedly for a long time.
Exercise librsvg’s major code paths for parsing and rendering separately. For example, librsvg uses different parts of the XML parser depending on whether it is being pushed data, vs. being asked to pull data from a stream. Also, we may only want to benchmark the parser but not the renderer; or we may want to parse SVGs only once but render them many times after that.
Compiling¶
This benchmark is compiled along with librsvg
.
To compile the benchmark, you need to setup your development or test environment
for the librsvg
library. You can follow the instructions in
Setting up your development environment.
You can also simply run cargo build --release -p rsvg-bench
in the
root of the librsvg
source tree. This command will compile but the
librsvg
library and the rsvg-bench
benchmark, linked together in a
static binary. You can run this binary from ./target/release/rsvg-bench
.
Usage / benchmarking¶
After compiling it, the rsvg-bench
binary will be available
in the target/release
directory of the librsvg
source tree.
Please make sure you compiled with -release
; when librsvg is
installed normally it gets built in release mode (with optimizations),
so this will get you meaningful timings.
You can run the rsvg-bench
binary with the following command line options:
Running target/release/rsvg-bench --help
will display the help message.
Benchmarking utility for librsvg.
Usage: rsvg-bench [OPTIONS] [inputs]...
Arguments:
[inputs]... Input files or directories
Options:
--sleep <sleep> Number of seconds to sleep before starting to process SVGs [default: 0]
--num-parse <num-parse> Number of times to parse each file [default: 1]
--num-render <num-render> Number of times to render each file [default: 1]
--hard-failures Stop all processing when a file cannot be rendered
-h, --help Print help
-V, --version Print version
Benchmarking files¶
Rsvg-bench does not extract timings by itself. You can use other
tools to do it. /usr/bin/time
is a simple and accurate way (note
that this is different from the time
command in most shells).
Benchmarking all the SVG files in a directory tree¶
/usr/bin/time target/release/rsvg-bench /path/to/svg/files
This command will benchmark the rendering of all the SVG files in the directory /path/to/svg/files
.
The benchmark will parse each file once and render it once.
hard_failures: false
Will parse each file 1 times
Will render each file 1 times
Rendering to Cairo image surface
Sleeping for 0 seconds before processing SVGs...
Processing files!
Processing "rsvg/tests/fixtures/text/"
Processing "rsvg/tests/fixtures/text/hello-world.svg"
Processing "rsvg/tests/fixtures/text/bounds-ref.svg"
Processing "rsvg/tests/fixtures/text/display-none.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden-ref.svg"
Processing "rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg"
Processing "rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg"
Processing "rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg"
Processing "rsvg/tests/fixtures/text/unicode-bidi-override.svg"
Processing "rsvg/tests/fixtures/text/display-none-ref.svg"
Processing "rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg"
Processing "rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg"
Processing "rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg"
Processing "rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg"
Processing "rsvg/tests/fixtures/text/bounds.svg"
0.28user 0.05system 0:00.29elapsed 114%CPU (0avgtext+0avgdata 31912maxresident)k
136inputs+0outputs (2major+1941minor)pagefaults 0swaps
The output will show the time taken to render each file. The time is in seconds, the number of times each files are parsed and rendered, and the number of files that were processed.
Benchmarking specific files¶
target/release/rsvg-bench /path/to/svg/files/file.svg
This command will benchmark the rendering of a single SVG file /path/to/svg/files/file.svg
.
The benchmark will parse the file once and render it once.
You can also benchmark multiple files by passing their names:
target/release/rsvg-bench /path/to/svg/files/file1.svg /path/to/svg/files/file2.svg /path/to/svg/files/file3.svg
This command will benchmark the rendering of the SVG files /path/to/svg/files/file1.svg
, /path/to/svg/files/file2.svg
,
and /path/to/svg/files/file3.svg
. The benchmark will parse each file once and render it once.
hard_failures: false
Will parse each file 1 times
Will render each file 1 times
Rendering to Cairo image surface
Sleeping for 0 seconds before processing SVGs...
Processing files!
Processing "/path/to/svg/files/file1.svg"
Processing "/path/to/svg/files/file2.svg"
Processing "/path/to/svg/files/file3.svg"
0.28user 0.05system 0:00.29elapsed 114%CPU (0avgtext+0avgdata 31912maxresident)k
136inputs+0outputs (2major+1941minor)pagefaults 0swaps
Benchmarking with options¶
The rsvg-bench
binary has several command line options that can be used to customize the benchmarking process.
They are listed above when we ran the –help option with the target/release/rsvg-bench command.
These options are:
--sleep <sleep>
: Number of seconds to sleep before starting to process SVGs [default: 0]--num-parse <num-parse>
: Number of times to parse each file [default: 1]--num-render <num-render>
: Number of times to render each file [default: 1]--hard-failures
: Stop all processing when a file cannot be rendered
You can ask rsvg-bench
to sleep for a number of seconds before processing the SVG files.
This is useful when you want to give the system some time to settle before
starting the benchmarking process and also so that you can attach a profiler
to it. For example, sysprof <https://blogs.gnome.org/chergert/2016/04/19/how-to-sysprof/>_
lets you choose an already-running process to monitor.
target/release/rsvg-bench --sleep 5 /path/to/svg/files
This command will benchmark the rendering of all the SVG files in the directory /path/to/svg/files
.
The benchmark will parse each file once and render it once.
The benchmark will sleep for 5 seconds before processing the SVG files.
hard_failures: false
Will parse each file 1 times
Will render each file 1 times
Rendering to Cairo image surface
Sleeping for 5 seconds before processing SVGs...
Processing files!
Processing "rsvg/tests/fixtures/text/"
Processing "rsvg/tests/fixtures/text/hello-world.svg"
Processing "rsvg/tests/fixtures/text/bounds-ref.svg"
Processing "rsvg/tests/fixtures/text/display-none.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden-ref.svg"
Processing "rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg"
Processing "rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg"
Processing "rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg"
Processing "rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg"
Processing "rsvg/tests/fixtures/text/unicode-bidi-override.svg"
Processing "rsvg/tests/fixtures/text/display-none-ref.svg"
Processing "rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg"
Processing "rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg"
Processing "rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg"
Processing "rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg"
Processing "rsvg/tests/fixtures/text/bounds.svg"
0.28user 0.05system 0:00.29elapsed 114%CPU (0avgtext+0avgdata 31912maxresident)k
136inputs+0outputs (2major+1941minor)pagefaults 0swaps
target/release/rsvg-bench --num-parse 2 --num-render 2 /path/to/svg/files
This command will benchmark the rendering of all the SVG files in the directory /path/to/svg/files
.
The benchmark will parse each file twice and render it twice.