Files
json/docs/mkdocs/docs/api/macros/json_view_use_ssse3.md
Niels Lohmann eb6c92e899 Scan the strings of json_view with NEON and SSE2
Long runs of string bytes are scanned 16 at a time with NEON (AArch64, with
GCC and Clang) and SSE2 (x86-64): both belong to the baseline instruction
sets. A signed compare with 0x20 finds control characters and non-ASCII
bytes at once. Keys keep 16 table checks before the vector loop (their
lengths repeat from record to record, so the branches predict well);
string values have 8, as their lengths vary more.

Non-ASCII text is validated 16 bytes at a time with the "lookup4" check of
simdjson (J. Keiser and D. Lemire, "Validating UTF-8 In Less Than One
Instruction Per Byte", 2021): with NEON, and on x86-64 with SSSE3 if
JSON_VIEW_USE_SSSE3 is defined (SSSE3 is not part of x86-64, and the code
must not depend on the flags of a translation unit). JSON_VIEW_NO_SIMD
selects the portable code. The vector code sits in
detail/view/simd.hpp; the same input is accepted either way.

json_document::parse, best of 7 runs in separate processes (M1 Max):
poet.json (CJK text) -72%, random.json -25%, twitter.json -22%,
gsoc-2018.json -20%, semanticscholar -19%, github_events -11%,
apache_builds -9.5%, canada/citm -5/-6%; lottie +4%, tree-pretty +2.5%.

Tests: every two-byte sequence and three- and four-byte sequences with
continuation bytes at the edges of their ranges, at every offset around
the vector blocks of keys and values, cut short, and long runs of text
with a damaged byte, against json::accept and json::parse. CMake builds
the parser tests again with JSON_VIEW_NO_SIMD, and on x86-64 with
JSON_VIEW_USE_SSSE3 and -mssse3; the macros are documented.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-09-30 15:08:43 +02:00

1.8 KiB

JSON_VIEW_USE_SSSE3

#define JSON_VIEW_USE_SSSE3

When defined on x86-64, the parser of basic_json_document (<nlohmann/json_view.hpp>) validates non-ASCII text in strings with SSSE3, 16 bytes at a time, using the "lookup4" algorithm of simdjson. Without it, non-ASCII text is validated one UTF-8 sequence at a time on x86-64; on AArch64, the vector check uses NEON and is always on.

SSSE3 is not part of the x86-64 baseline, so the code must be compiled for it: define the macro only together with a compiler option that enables SSSE3 (e.g. -mssse3, or -march= with a CPU that has it), and only for programs that run on such CPUs. The same input is accepted or rejected either way; only the speed of non-ASCII text differs.

!!! warning "Define consistently"

The macro selects between two definitions of the same inline functions. It must therefore be defined identically,
with the same compiler options, for **every** translation unit that includes `<nlohmann/json_view.hpp>`; mixing
translation units that define it with ones that do not is an ODR violation. Prefer a compile definition on the
target.

Default definition

By default, #!cpp JSON_VIEW_USE_SSSE3 is not defined.

#undef JSON_VIEW_USE_SSSE3

Examples

??? example

With CMake, for a program that only runs on CPUs with SSSE3:

```cmake
target_compile_definitions(your_target PRIVATE JSON_VIEW_USE_SSSE3)
target_compile_options(your_target PRIVATE -mssse3)
```

See also

Version history

  • Added in version 3.13.0.