| C++ Benchmarks {#flatbuffers_benchmarks} |
| ========== |
| |
| Comparing against other serialization solutions, running on Windows 7 |
| 64bit. We use the LITE runtime for Protocol Buffers (less code / lower |
| overhead), Rapid JSON (one of the fastest C++ JSON parsers around), |
| and pugixml, also one of the fastest XML parsers. |
| |
| We also compare against code that doesn't use a serialization library |
| at all (the column "Raw structs"), which is what you get if you write |
| hardcoded code that just writes structs. This is the fastest possible, |
| but of course is not cross platform nor has any kind of forwards / |
| backwards compatibility. |
| |
| We compare against Flatbuffers with the binary wire format (as |
| intended), and also with JSON as the wire format with the optional JSON |
| parser (which, using a schema, parses JSON into a binary buffer that can |
| then be accessed as before). |
| |
| The benchmark object is a set of about 10 objects containing an array, 4 |
| strings, and a large variety of int/float scalar values of all sizes, |
| meant to be representative of game data, e.g. a scene format. |
| |
| | | FlatBuffers (binary) | Protocol Buffers LITE | Rapid JSON | FlatBuffers (JSON) | pugixml | Raw structs | |
| |--------------------------------------------------------|-----------------------|-----------------------|-----------------------|------------------------| ----------------------| ----------------------| |
| | Decode + Traverse + Dealloc (1 million times, seconds) | 0.08 | 302 | 583 | 105 | 196 | 0.02 | |
| | Decode / Traverse / Dealloc (breakdown) | 0 / 0.08 / 0 | 220 / 0.15 / 81 | 294 / 0.9 / 287 | 70 / 0.08 / 35 | 41 / 3.9 / 150 | 0 / 0.02 / 0 | |
| | Encode (1 million times, seconds) | 3.2 | 185 | 650 | 169 | 273 | 0.15 | |
| | Wire format size (normal / zlib, bytes) | 344 / 220 | 228 / 174 | 1475 / 322 | 1029 / 298 | 1137 / 341 | 312 / 187 | |
| | Memory needed to store decoded wire (bytes / blocks) | 0 / 0 | 760 / 20 | 65689 / 4 | 328 / 1 | 34194 / 3 | 0 / 0 | |
| | Transient memory allocated during decode (KB) | 0 | 1 | 131 | 4 | 34 | 0 | |
| | Generated source code size (KB) | 4 | 61 | 0 | 4 | 0 | 0 | |
| | Field access in handwritten traversal code | typed accessors | typed accessors | manual error checking | typed accessors | manual error checking | typed but no safety | |
| | Library source code (KB) | 15 | some subset of 3800 | 87 | 43 | 327 | 0 | |
| |
| ### Some other serialization systems we compared against but did not benchmark (yet), in rough order of applicability: |
| |
| - Cap'n'Proto promises to reduce Protocol Buffers much like FlatBuffers does, |
| though with a more complicated binary encoding and less flexibility (no |
| optional fields to allow deprecating fields or serializing with missing |
| fields for which defaults exist). |
| It currently also isn't fully cross-platform portable (lack of VS support). |
| - msgpack: has very minimal forwards/backwards compatibility support when used |
| with the typed C++ interface. Also lacks VS2010 support. |
| - Thrift: very similar to Protocol Buffers, but appears to be less efficient, |
| and have more dependencies. |
| - YAML: a superset of JSON and otherwise very similar. Used by e.g. Unity. |
| - C# comes with built-in serialization functionality, as used by Unity also. |
| Being tied to the language, and having no automatic versioning support |
| limits its applicability. |
| - Project Anarchy (the free mobile engine by Havok) comes with a serialization |
| system, that however does no automatic versioning (have to code around new |
| fields manually), is very much tied to the rest of the engine, and works |
| without a schema to generate code (tied to your C++ class definition). |
| |
| ### Code for benchmarks |
| |
| Code for these benchmarks sits in `benchmarks/` in git branch `benchmarks`. |
| It sits in its own branch because it has submodule dependencies that the main |
| project doesn't need, and the code standards do not meet those of the main |
| project. Please read `benchmarks/cpp/README.txt` before working with the code. |
| |
| <br> |