Writing a Really, Really Fast JSON Parser
Chad Austin (via Hacker News):
Here are the optimizations that mattered:
- Moved the input and output pointers into locals instead of members, which helps VC++ and Clang understand that they can be placed in registers. (gcc was already performing that optimization.) 71078d3 4a07c77
- Replaced the entire parse loop with a goto state machine. Surprisingly, not only was this a performance win, but it actually made the code clearer. 3828769 05b3ec8 c02cb31
- Change an 8-entry enum to a
uint8_t
instead of the pointer-sized value it was defaulting to. 799c55f- Duplicated a bit of code to avoid needing to call a function pointer. 44ec0df
- Tiny microoptimizations like avoiding branches and unnecessary data flow. 235d330 002ba31 193b183 c23fa23
- Store the tag bits at the bottom of the element index instead of the top, which avoids a shift on 64-bit. e7f2351
[…]
An iOS team at Dropbox replaced JSONSerialization with sajson and cut their initial load times by two thirds!
Previously: Parsing JSON Is a Minefield.