To ensure that changes to Chr.Avro don’t introduce major performance regressions (and to highlight areas where performance could be improved), we maintain a set of rudimentary benchmarks to test serialization throughput.
Each benchmark runs five times, and we take the average time of those runs. These results were collected on a GitHub Actions worker running Ubuntu:
Benchmark | Average time (ms) | ||
---|---|---|---|
Chr.Avro | Confluent.Apache.Avro | ||
array[double] | deserialization 100,000 iterations | 20.214 | n/a |
serialization 100,000 iterations | 41.771 | n/a | |
array[double] (generic) | deserialization 100,000 iterations | n/a | 38.513 |
serialization 100,000 iterations | n/a | 62.156 | |
array[double] (specific) | deserialization 100,000 iterations | n/a | 49.035 |
serialization 100,000 iterations | n/a | 62.660 | |
boolean | deserialization 1,000,000 iterations | 2.311 | 34.814 |
serialization 1,000,000 iterations | 6.902 | 67.869 | |
double | deserialization 1,000,000 iterations | 30.924 | 58.412 |
serialization 1,000,000 iterations | 42.508 | 110.496 | |
fixed[12] | deserialization 1,000,000 iterations | 19.187 | n/a |
serialization 1,000,000 iterations | 25.234 | n/a | |
fixed[12] (generic) | deserialization 1,000,000 iterations | n/a | 73.483 |
serialization 1,000,000 iterations | n/a | 74.433 | |
fixed[12] (specific) | deserialization 1,000,000 iterations | n/a | 88.462 |
serialization 1,000,000 iterations | n/a | 34.325 | |
fixed[2048] | deserialization 100,000 iterations | 59.988 | n/a |
serialization 100,000 iterations | 63.224 | n/a | |
fixed[2048] (generic) | deserialization 100,000 iterations | n/a | 63.525 |
serialization 100,000 iterations | n/a | 63.760 | |
fixed[2048] (specific) | deserialization 100,000 iterations | n/a | 68.915 |
serialization 100,000 iterations | n/a | 63.502 | |
float | deserialization 1,000,000 iterations | 22.998 | 54.323 |
serialization 1,000,000 iterations | 32.756 | 78.465 | |
int | deserialization 1,000,000 iterations | 9.658 | 46.015 |
serialization 1,000,000 iterations | 18.911 | 64.618 | |
long | deserialization 1,000,000 iterations | 12.969 | 59.512 |
serialization 1,000,000 iterations | 34.380 | 76.131 | |
map[double] | deserialization 100,000 iterations | 37.479 | n/a |
serialization 100,000 iterations | 41.359 | n/a | |
map[double] (generic) | deserialization 100,000 iterations | n/a | 51.784 |
serialization 100,000 iterations | n/a | 64.784 | |
map[double] (specific) | deserialization 100,000 iterations | n/a | 58.827 |
serialization 100,000 iterations | n/a | 83.686 | |
record | deserialization 100,000 iterations | 97.870 | n/a |
serialization 100,000 iterations | 87.352 | n/a | |
record (generic) | deserialization 100,000 iterations | n/a | 60.221 |
serialization 100,000 iterations | n/a | 39.633 | |
record (specific) | deserialization 100,000 iterations | n/a | 33.984 |
serialization 100,000 iterations | n/a | 33.804 | |
string | deserialization 1,000,000 iterations | 74.759 | 99.088 |
serialization 1,000,000 iterations | 79.096 | 125.743 |
In the future, we’re hoping to expand the benchmarks to test more complex situations as well as non-.NET libraries.