64 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
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>
 |