Introduction

Here are present actual charts for performance comparison of serialization libraries for Scala for the corresponding article «Scala Serialization».

The legend for tests. «Site» is a data transfer object (DTO) with different types of data (lists, enums, regular fields). «Events» are the primitive representation of this DTO for Event Sourcing (many small objects). Data sizes (1k, 2k etc.) are the corresponding size of the DTO in JSON format.

Please notice, that unlike the article, here the performance tests are performed via JMH and using 2 threads. The configuration of a hardware is Intel® Core™ i7–5600U CPU @ 2.60GHz × 4 (2 core + 2 HT) with 16 GB RAM.

Changelog

  • Major upgrade to scala 2.12.4.
  • Add CBOR data format (via Jackson)
  • Upgrade versions of libraries: jackson (2.9.5), protobuf (3.4.0), boopickle (1.3.0), chill (0.9.2).
  • Downgrade: protobuf (3.1.0).
  • Fixed Chill threading via state per thread (no penalty for clone for it).
  • Remove circe (failed to compile).

  • Introduced benchmark for Circe library.
  • Downgrade versions (because using bazel rules): scrooge (4.6.0).
  • Upgrade versions of libraries: scala-library (2.11.8), jackson (2.9.1), protobuf (3.4.0), scalapb (0.6.5), boopickle (1.2.5), chill (0.9.2).
  • Fixed issue with Chill by cloning input array (therefore it’s time of Chill + array clone).

  • Initial version of benchmark.
  • Libraries: scala-library (2.11.7), jackson (2.7.3), protobuf (3.0.0-beta-2), scalapb (0.5.31), scala-pickling (0.11.0-M2), boopickle (1.2.4), chill (0.8.0), libthrift (0.9.1), scrooge (4.7.0).
  • Chill failed with ”Buffer underflow” exception on only-deserialization benchmarks, because of bug.

Charts

  • avg
  • p0
  • p50
  • p95
  • p99
  • p100

avg - average, p0 - percentile 0 (min), p50 - percentile 50 (median), p95 - percentile 95, p99 - percentile 99, p100 - percentile 100 (max)

Site Two-Way

Events Two-Way

Site Serialization

Site Deserialization

Events Serialization

Events Deserialization

Full JMH log is here.