mirror of
https://github.com/nlohmann/json.git
synced 2026-09-30 14:05:18 +00:00
The default dump() (no indentation, no ensure_ascii) gets its own writer: the same walk and output, with the write position in a local variable (stores through char pointers would otherwise force a reload of the buffer's members after each one), strings and number tokens of the source copied by fixed-size moves of 32 bytes where the source has that many bytes left (the buffer keeps 64 bytes of slack), and decoded strings copied in runs up to the next quote, backslash, or control character. Documents that are not edited are walked through the node array in order, so that a frame only needs the end of its container, and integer tokens are read from the source directly. The innermost open container is kept in local variables, and the stack holds only the ones around it; the stack starts in a local array of 32 and moves to the heap only for deeper nesting (its address does not escape, so its pointers stay in registers). Dumps of shallow documents thus allocate only the output, whose first size includes the slack, so it does not grow just before the end. The long copies are out of line: otherwise, the compiler merges the fixed-size moves into the same library call. These techniques come from the prototype; the writer lost them when the view was split into pull requests, which made dump() 2 to 3 times slower. Signed-off-by: Niels Lohmann <mail@nlohmann.me>