Performance

May 28, 2016 ยท View on GitHub

Below is a performance comparison between NetSerializer and protobuf-net. Protobuf-net is a fast Protocol Buffers compatible serializer, which was the best serializer I could find out there when I considered the serializer for my use case.

The tests create an array of N items of particular type, created with random data. The items are then serialized, and this is repeated M times for the same dataset. NetSerializer can also serialize types directly, without writing any meta information or boxing of value types. These tests are marked with "(direct)".

The table lists the time it takes run the test, the number of GC collections (per generation) that happened during the test, and the size of the outputted serialized data (when available).

There are three tests:

  • MemStream Serialize - serializes an array of objects to a memory stream.

  • MemStream Deserialize - deserializes the stream created with MemStream Serialize test.

  • NetTest - uses two threads, of which the first one serializes objects and sends them over a local socket, and the second one receive the data and deserialize the objects. Note that the size is not available for NetTest, as tracking the sent data is not trivial. However, the dataset is the same as with MemStream, an so is the size of the data.

The details of the tests can be found from the source code. The tests were run on a 64bit Windows 10 laptop.

100 LargeStruct x 30000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize52691 0 01859
NetSerializerMemStream Deserialize43991 0 0
NetSerializerNetTest751184 0 0
protobuf-netMemStream Serialize987381 0 02151
protobuf-netMemStream Deserialize1586183 0 0
protobuf-netNetTest2151566 0 0

100 LargeStruct x 30000 (direct)

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize4630 0 01759
NetSerializerMemStream Deserialize4130 0 0
NetSerializerNetTest6610 0 0

100 Guid x 50000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize733101 0 01964
NetSerializerMemStream Deserialize509101 0 0
NetSerializerNetTest939204 0 0
protobuf-netMemStream Serialize4487890 0 02100
protobuf-netMemStream Deserialize4503279 0 0
protobuf-netNetTest58031178 0 0

100 Guid x 50000 (direct)

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize6420 0 01876
NetSerializerMemStream Deserialize4990 0 0
NetSerializerNetTest8190 0 0

100 Int32 x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize617152 0 0461
NetSerializerMemStream Deserialize426152 0 0
NetSerializerNetTest742306 0 0
protobuf-netMemStream Serialize87781527 0 0648
protobuf-netMemStream Deserialize9078560 14 0
protobuf-netNetTest114162103 1 0

100 Int32 x 100000 (direct)

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize4680 0 0361
NetSerializerMemStream Deserialize4280 0 0
NetSerializerNetTest5800 0 0

100 U8Message x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize3890 0 0200
NetSerializerMemStream Deserialize991152 0 0
NetSerializerNetTest1137152 0 0
protobuf-netMemStream Serialize3007966 0 0527
protobuf-netMemStream Deserialize5745152 0 0
protobuf-netNetTest69251122 0 0

100 U8Message x 100000 (direct)

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize2810 0 0100
NetSerializerMemStream Deserialize1047152 0 0
NetSerializerNetTest1156152 0 0

100 S16Message x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize5120 0 0341
NetSerializerMemStream Deserialize1110152 0 0
NetSerializerNetTest1347152 0 0
protobuf-netMemStream Serialize3204966 0 0844
protobuf-netMemStream Deserialize5986152 0 0
protobuf-netNetTest73251122 0 0

100 S32Message x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize5930 0 0461
NetSerializerMemStream Deserialize1207152 0 0
NetSerializerNetTest1475152 0 0
protobuf-netMemStream Serialize3371966 0 0828
protobuf-netMemStream Deserialize6066152 0 0
protobuf-netNetTest75351120 0 0

100 S64Message x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize6990 0 0542
NetSerializerMemStream Deserialize1313152 0 0
NetSerializerNetTest1603152 0 0
protobuf-netMemStream Serialize3512966 0 0809
protobuf-netMemStream Deserialize6268152 0 0
protobuf-netNetTest76721124 0 0

100 DecimalMessage x 50000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize648127 0 01360
NetSerializerMemStream Deserialize934101 0 0
NetSerializerNetTest1292229 0 0
protobuf-netMemStream Serialize2716610 0 02022
protobuf-netMemStream Deserialize4220101 0 0
protobuf-netNetTest5052713 0 0

100 NullableDecimalMessage x 100000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize4417 0 0238
NetSerializerMemStream Deserialize1156254 0 0
NetSerializerNetTest1340262 0 0
protobuf-netMemStream Serialize4033973 0 0353
protobuf-netMemStream Deserialize6727254 0 0
protobuf-netNetTest82031233 0 0

100 PrimitivesMessage x 10000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize70325 0 05286
NetSerializerMemStream Deserialize74876 0 0
NetSerializerNetTest1010102 0 0
protobuf-netMemStream Serialize72596 0 07290
protobuf-netMemStream Deserialize108950 0 0
protobuf-netNetTest1348148 0 0

10 DictionaryMessage x 1000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize131075 0 086187
NetSerializerMemStream Deserialize1955109 54 0
NetSerializerNetTest2521135 67 0
protobuf-netMemStream Serialize1713413 0 0142035
protobuf-netMemStream Deserialize3576233 116 0
protobuf-netNetTest4693494 247 11

100 ComplexMessage x 10000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize4100 0 02838
NetSerializerMemStream Deserialize608100 0 0
NetSerializerNetTest812100 0 0
protobuf-netMemStream Serialize83896 0 05087
protobuf-netMemStream Deserialize1902100 0 0
protobuf-netNetTest2195198 0 0

100 StringMessage x 20000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize4470 0 04886
NetSerializerMemStream Deserialize655182 0 0
NetSerializerNetTest903182 0 0
protobuf-netMemStream Serialize1043193 0 05085
protobuf-netMemStream Deserialize3973182 0 0
protobuf-netNetTest2428378 0 0

100 StructMessage x 20000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize5280 0 02455
NetSerializerMemStream Deserialize681117 0 0
NetSerializerNetTest909117 0 0
protobuf-netMemStream Serialize1369274 0 03622
protobuf-netMemStream Deserialize4297280 0 0
protobuf-netNetTest2752557 0 0

100 BoxedPrimitivesMessage x 20000

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize7080 0 01723
NetSerializerMemStream Deserialize570223 0 0
NetSerializerNetTest862223 0 0

10000 ByteArrayMessage x 1

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize7361 1 1498085311
NetSerializerMemStream Deserialize32558 29 1
NetSerializerNetTest88958 27 0
protobuf-netMemStream Serialize1329341 6 3498151945
protobuf-netMemStream Deserialize41858 29 1
protobuf-netNetTest1696172 40 2

1000 IntArrayMessage x 1

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize15330 0 0177278871
NetSerializerMemStream Deserialize11472 1 0
NetSerializerNetTest18213 1 0
protobuf-netMemStream Serialize184979 4 2283510795
protobuf-netMemStream Deserialize172028 3 0
protobuf-netNetTest262088 5 2

10 TriDimArrayCustomSerializersMessage x 100

time (ms)GC coll.size (B)
NetSerializerMemStream Serialize12460 0 01601277
NetSerializerMemStream Deserialize117530 27 25
NetSerializerNetTest184443 41 38

As can be seen from the tests, NetSerializer is clearly faster and has smaller memory footprint in about all of the cases. For example, the tests with ComplexMessages show NetSerializer's MemStream Serialize cause zero garbage collections, even though more than 20MB of data is being serialized.