mirror of
https://github.com/nlohmann/json.git
synced 2026-10-22 22:08:55 +00:00
An entry was written as up to five separate sink writes (type, name, null byte, then the number as a std::array that was reversed and copied) and, in an array, from a string_t built for the index. The size pass looked for U+0000 in every key with std::string::find() (a call that calls memchr()), and built a string_t and called sanitize_utf8_for_write() for the default error handler, which returns the key unchanged. Entries of booleans, numbers and null are now encoded straight into space reserved from the sink, as the CBOR and MessagePack writers do for integer runs. A run of such elements in an array keeps the write pointer, the index, and the digits of its name in locals, so that nothing is reloaded after each character store. The entry of an object member does the same for one entry, and a string or binary value writes its header the same way. The name is searched for U+0000 eight characters at a time, and the string_t for the other error handlers is built in a function of its own. Instructions per call (Linux, GCC 13, thousands), to_bson: 20000 integers 6486 -> 2680, 20000 floats 6562 -> 3050, canada 55282 -> 47186, twitter 5865 -> 5140, 20000 small objects 37171 -> 33559. Signed-off-by: Niels Lohmann <mail@nlohmann.me>