Binary and JSON serializer benchmarks updated

Yan Cui

I help clients go faster for less using serverless technologies.

Table of Content

This article is brought to you by

The real-time data platform that empowers developers to build innovative products faster and more reliably than ever before.

Learn more

First of all I’d like to offer my sincere apologies to those who have asked me to update my benchmark numbers following the release of Json.NET 5.0.6, it took me a long time to clear some of my backlogs and only just got around to it, sorry for the waiting!

The good news is that, based on my tests against a simple POCO object (that’s representative of the payload that I work with often) Json.NET has delivered on its promised and offered big improvements on deserialization performance and is now neck-to-neck with ServiceStack.Text in terms of deserialization speed.

 

DISCLAIMER : as always, you should be benchmark against your payload and use case, the benchmark numbers I have produced here is unlikely to be representative of your use cases and neither is anybody else’s benchmark numbers.

You can use the simple test harness I created and see this example code for my JSON serializer tests to benchmark against your particular payload.

 

JSON

Here is the result against the latest versions of JSON serializers at the time of writing:

image

image

Versions of serializers tested:

 

As mentioned previously, the latest version of Json.Net has made big improvements on its deserialization speed and is now on par with ServiceStack.Text.

 

Binary

image12[1]

image16

Versions of serializers tested:

 

As you can see, there is little to choose between the usual suspects of protobuf-net, MessagePack and MessageShark, who are well clear of the rest of the pack. I have also included two additional binary serializers:

  • FlourineFX, an open source library for working with Flash/Flex remoting, and comes with a serializer for AMF encoded data
  • Filbert, a BERT (Binary ERlang Term) serializer and BERT-RPC client I wrote in F#. As you can see, purely from a performance point of view it needs much optimization on its deserialization speed (specifically it needs a buffer pool rather than allocating new array each time) which I have been hoping to find time to do for a while. In general, is interoperability with Erlang something .Net developers are interested in exploring? Would love to hear your thoughts on the matter, and if you know of alternative approaches (other than via something like BERT) you think worth investing.

 

Links

My Benchmarks

Simple Speed Tester

Code for the JSON benchmarks

Code for the binary benchmarks

Whenever you’re ready, here are 4 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
  2. Do you want to know how to test serverless architectures with a fast dev & test loop? Check out my latest course, Testing Serverless Architectures and learn the smart way to test serverless.
  3. I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
  4. Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.

Leave a Comment

Your email address will not be published. Required fields are marked *