Zserio Benchmarks
In this folder you find a number of size and performance Zserio benchmarks with different data sets. If you are looking for benchmarks to compare Zserio and Protobuf, you might be interested in Protobuf Benchmarks by Zserio.
Running
Running can be done by provided benchmark.sh script which accepts as a parameter required platform
(e.g. cpp-linux64-gcc):
scripts/benchmark.sh <PLATFORM>
The script benchmark.sh automatically generates simple performance test for each benchmark.
The performance test uses generated Zserio’ API to read appropriate dataset from JSON format,
serialize it into the binary format and then read it again. Both reading time and the BLOB
size are reported. BLOB size after zip compression is reported as well.
Results
- Used platform: 64-bit Linux Mint 21.1, Intel(R) Core(TM) i7-9850H CPU @ 2.60GHz
- Used compilers: gcc 11.4.0, Java 1.8.0_382, Python 3.10.12
- Used Zserio version: 3.12
Addressbook
| Benchmark | Dataset | Target | Time | Blob Size | Zip Size |
|---|---|---|---|---|---|
| addressbook.zs | addressbook.json | C++ (linux64-gcc) | 1.478ms | 305.838kB | 222kB |
| addressbook_align.zs | addressbook.json | C++ (linux64-gcc) | 0.844ms | 311.424kB | 177kB |
| addressbook_packed.zs | addressbook.json | C++ (linux64-gcc) | 1.574ms | 297.619kB | 234kB |
| addressbook.zs | addressbook.json | Java | 2.618ms | 305.838kB | 222kB |
| addressbook_align.zs | addressbook.json | Java | 1.677ms | 311.424kB | 177kB |
| addressbook_packed.zs | addressbook.json | Java | 3.174ms | 297.619kB | 234kB |
| addressbook.zs | addressbook.json | Python | 212.694ms | 305.838kB | 222kB |
| addressbook_align.zs | addressbook.json | Python | 82.406ms | 311.424kB | 177kB |
| addressbook_packed.zs | addressbook.json | Python | 245.361ms | 297.619kB | 234kB |
| addressbook.zs | addressbook.json | Python (C++) | 49.357ms | 305.838kB | 222kB |
| addressbook_align.zs | addressbook.json | Python (C++) | 48.737ms | 311.424kB | 177kB |
| addressbook_packed.zs | addressbook.json | Python (C++) | 62.915ms | 297.619kB | 234kB |
Schema align
Zserio schema _align does contain enumeration field PhoneType in schema byte-aligned. This means that such
schema will need bigger Blob size but it should have reading time faster. As a consequence, binary data of such
schema can be better compressed, e.g. by zip algorithm.
Schema packed
Zserio schema _packed compresses arrays people[] and phones[] using delta compression. This means that
such schema will need smaller Blob size but it should have reading time slower. As a consequence, binary data of
such schema can be worse compressed, e.g. by zip algorithm.
Apollo
| Benchmark | Dataset | Target | Time | Blob Size | Zip Size |
|---|---|---|---|---|---|
| apollo.zs | apollo.zs.json | C++ (linux64-gcc) | 0.244ms | 226.507kB | 144kB |
| apollo.zs | apollo.zs.json | Java | 0.965ms | 226.507kB | 144kB |
| apollo.zs | apollo.zs.json | Python | 46.898ms | 226.507kB | 144kB |
| apollo.zs | apollo.zs.json | Python (C++) | 19.126ms | 226.507kB | 144kB |
CarSales
| Benchmark | Dataset | Target | Time | Blob Size | Zip Size |
|---|---|---|---|---|---|
| carsales.zs | carsales.json | C++ (linux64-gcc) | 1.374ms | 280.340kB | 259kB |
| carsales_align.zs | carsales.json | C++ (linux64-gcc) | 0.925ms | 295.965kB | 205kB |
| carsales_packed.zs | carsales.json | C++ (linux64-gcc) | 1.644ms | 273.909kB | 234kB |
| carsales_packed.zs | carsales_sorted.json | C++ (linux64-gcc) | 1.552ms | 262.546kB | 238kB |
| carsales.zs | carsales.json | Java | 2.942ms | 280.340kB | 259kB |
| carsales_align.zs | carsales.json | Java | 1.893ms | 295.965kB | 205kB |
| carsales_packed.zs | carsales.json | Java | 3.761ms | 273.909kB | 234kB |
| carsales_packed.zs | carsales_sorted.json | Java | 3.558ms | 262.546kB | 238kB |
| carsales.zs | carsales.json | Python | 224.082ms | 280.340kB | 259kB |
| carsales_align.zs | carsales.json | Python | 105.024ms | 295.965kB | 205kB |
| carsales_packed.zs | carsales.json | Python | 260.414ms | 273.909kB | 234kB |
| carsales_packed.zs | carsales_sorted.json | Python | 245.950ms | 262.546kB | 238kB |
| carsales.zs | carsales.json | Python (C++) | 45.355ms | 280.340kB | 259kB |
| carsales_align.zs | carsales.json | Python (C++) | 45.631ms | 295.965kB | 205kB |
| carsales_packed.zs | carsales.json | Python (C++) | 76.779ms | 273.909kB | 234kB |
| carsales_packed.zs | carsales_sorted.json | Python (C++) | 78.773ms | 262.546kB | 238kB |
Schema align
Zserio schema _align does contain all fields in schema byte-aligned. This means that such
schema will need bigger Blob size but it should have reading time faster. As a consequence, binary data of such
schema can be better compressed, e.g. by zip algorithm.
Schema packed
Zserio schema _packed compresses array carSales using delta compression. This means that
such schema will need smaller Blob size but it should have reading time slower. As a consequence, binary data of
such schema can be worse compressed, e.g. by zip algorithm.
Json sorted
Json representation _sorted does contain sorted CarSale array elements according to the fields year
and price. This should improve used delta compression of the array carSales.
SimpleTrace
| Benchmark | Dataset | Target | Time | Blob Size | Zip Size |
|---|---|---|---|---|---|
| simpletrace.zs | prague-groebenzell.json | C++ (linux64-gcc) | 0.221ms | 87.042kB | 66kB |
| simpletrace_packed.zs | prague-groebenzell.json | C++ (linux64-gcc) | 0.145ms | 40.266kB | 41kB |
| simpletrace.zs | prague-groebenzell.json | Java | 0.425ms | 87.042kB | 66kB |
| simpletrace_packed.zs | prague-groebenzell.json | Java | 1.145ms | 40.266kB | 41kB |
| simpletrace.zs | prague-groebenzell.json | Python | 65.112ms | 87.042kB | 66kB |
| simpletrace_packed.zs | prague-groebenzell.json | Python | 26.664ms | 40.266kB | 41kB |
| simpletrace.zs | prague-groebenzell.json | Python (C++) | 9.541ms | 87.042kB | 66kB |
| simpletrace_packed.zs | prague-groebenzell.json | Python (C++) | 17.136ms | 40.266kB | 41kB |
Schema packed
Zserio schema _packed compresses array trace using delta compression. This means that
such schema will need smaller Blob size but it should have reading time slower. As a consequence, binary data of
such schema can be worse compressed, e.g. by zip algorithm.
How to Add New Benchmark
- Add new dataset (e.g.
new_benchmark) in JSON format into datasets repository - Add new schema (e.g.
new_benchmark) in Zserio format into benchmarks directory - Make sure that the first structure in the schema file is the top level structure