- zmij::to_shortest() keeps the last digit apart from the 15 or 16 digits
before it, and dtoa_impl::write_shortest() converts those at once: with
SSE2 on x86-64 and NEON on 64-bit Arm (no CPU check needed), else eight
digits at a time. The decimal point is inserted in the register; reading
the digits back right after storing them stalled store forwarding.
- json::dump() writes floats and integers straight into its write buffer
instead of copying them from number_buffer, and integers below 10^16
eight digits at a time.
- json_view's dump() writes doubles from their bits and tokens of up to 15
digits through the same code; its own NEON writer is removed.
to_chars() on canada.json: 35 -> 29 ns per double (x86-64), 18.8 -> 14.2 ns
(Apple M1); json::dump() of canada.json 16-29% faster, of citm_catalog.json
14-19%.
Signed-off-by: Niels Lohmann <mail@nlohmann.me>