Tech article

How choosing the right JSON serializer can reduce server response time

JSON serializer

Efficient serving of pages created by users in our CMS is a crucial part of our business. Speed of rendering affects user experience and Google indexing – both of which impact our clients’ online sales.


To render the page first we have to provide its architecture by determining what blocks will be used and where they will be placed on the page. We also need to inject custom JS scripts and set the order in which they will be executed.

Until now information about the page architecture was combined from several JSON responses. To serialize them we were using jsonapi_serializer – a community-maintained fork of Netflix/fast_jsonapi, which for years was considered a benchmark of efficiency among Ruby developers.

Even though with jsonapi_serializer we could provide decent performance, we still saw some room for development, so we decided to rebuild our endpoints.

Initial solution

To improve efficiency we decided to combine all endpoints into one to provide one JSON response – the result was a rather large tree since in our page architecture there are several levels of children objects.

Initially, we sticked with jsonapi_serializer and strictly followed JSON:API standard. The result with flattened relations was not very readable but the response time was considerably shorter. Still, we wanted to check other options since last articles which compared Ruby serializers efficiency (like this one from Paweł Dąbrowski) were written several years ago and we suspected that since then the landscape could be changed a bit.

Tests

To check serializers efficiency we set up a simple test – using Benchmark we serialized component-heavy page 10 times in a row in order to get the appropriate average time.

In the first test, we compared jsonapi_serializer against the built-in Rails serializer active_model_serializers. The average time for one serialization was:

  • jsonapi_serializer.rb – 0.119 s
  • active_model_serializer – 0.038 s

Although we encountered some opinions that jsonapi_serializer is not optimized to handle many relations, this result was a total surprise to us.

In the next step, we tested our page with less-known, newer serializers. We chose Panko and Alba (which brand itself as “the fastest JSON serializer for Ruby”). These two results were even more promising, as the average times were:

  • Alba – 0.016 s
  • Panko – 0.011 s

That means that both serializers were 10 times faster than the jsonapi_serializer for our use case.

Conclusions and outcome

Our tests showed that, at least in the case of relationship-heavy structures, over the years jsonapi_serializer was outmatched by several other libraries, including the built-in Rails serializer.

As for our choice - despite Panko being slightly faster, in the end, we decided to use Alba for two reasons. Alba offers concise and powerful DSL which allows users to heavily customize JSON structure and naming. This, coupled with extensive documentation, makes it a great serializer for developers to work with.