mrkeyoor.com_
Sat 26 Sept 03:40 UTC
Dataevaluationupdated 26 Sept 2026

simdjson review

simdjson is a C++ library for reading and writing JSON with CPU vector instructions. It is built for systems where parsing time matters enough to accept a forward-moving API, padded input buffers, and careful object lifetimes.

Verdict

Our nested Rust benchmark installed 15 packages and built in 7 seconds, but cargo test ran 0 tests, so our run does not validate simdjson's C++ parser or its speed claims. simdjson deserves a production trial when your profiler identifies JSON parsing as a real cost and your team can work with On-Demand lifetimes. Pin a release, build a corpus from your own traffic, and compare end-to-end work rather than repeating the README's throughput figures.

We ran it

Lab card: what happened when we ran simdjsonScreenshot of simdjson (simdjson.org)
Install✓ · 1s15 packages
Build✓ · 7s
Tests✓ · 1s0 passed · 0 failed of 0 (cargo test)
Repo773 files~119,390 lines of source · 34.2 MB · 44 CI workflows · tests dir

Answers from our run

Does simdjson build from source?

Dependencies installed in 1 seconds (15 packages), and the build succeeded in 7 seconds. We cloned commit 23b236d into a clean Debian container with 3 CPUs and no project-specific setup.

Do simdjson's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use simdjson?

Developers who want an ordinary retained object tree: the default On-Demand document is an iterator over the source text, not a fully parsed value.

What are the alternatives to simdjson?

yyjson, JSON for Modern C++, RapidJSON. Our nested Rust benchmark installed 15 packages and built in 7 seconds, but cargo test ran 0 tests, so our run does not validate simdjson's C++ parser or its speed claims.

Setup4/5Single-file C++ path is simple; On-Demand rules need care
Docs5/5Detailed API, lifetime, padding, compiler, and tuning guidance
Community5/524,272 stars and a September 2026 push show active use
Maturity4/5Widely used, though v4.6.11 fixed six serious parser defects

Discussed on

  1. hnSimdjson – Parsing Gigabytes of JSON per Second598 points
  2. hnSimdjson: Parsing gigabytes of JSON per second503 points
  3. hnShow HN: Faster FastAPI with simdjson and io_uring on Linux 5.19290 points
  4. hnSimdjson 0.3: Faster JSON parser258 points
  5. hnThe simdjson library60 points

Who it’s for

C++ developers who have measured JSON parsing as a meaningful share of request or ingestion time.
Database, search, and analytics teams processing large JSON or NDJSON streams on 64-bit systems.
Engineers prepared to benchmark their own documents, compiler, CPU, and access pattern.
Applications that can reuse parsers and keep input buffers alive while reading On-Demand values.

Who it’s NOT for

Developers who want an ordinary retained object tree: the default On-Demand document is an iterator over the source text, not a fully parsed value.
Code that cannot manage input lifetimes and padding: the parser, source buffer, and document must remain alive, and On-Demand always requires padded input.
Applications that need full JSONPath support: the documentation says at_path() implements only the subset convertible to JSON Pointer.
Pipelines that must parse compressed JSON directly: open issue 1020 says callers currently have to decompress the document first.
Teams planning to follow the development branch in production: the maintainers explicitly tell product users to choose a release.

Setup reality

Our sandbox targeted benchmark/static_reflect/serde-benchmark/, not simdjson's main C++ library. It installed 15 Rust packages in 1 second and built in 7 seconds. cargo test succeeded in 1 second, but it discovered 0 tests, so the pass confirms compilation only.

The C++ quick start needs a 64-bit system plus GCC 7 or Clang 6 at minimum, with separate Visual Studio and Xcode paths. Basic use has no service, account, credential, or daemon; a release supplies one header and one source file.

On-Demand input needs padding and must outlive the document. Runtime CPU detection chooses an implementation, while old assemblers can reject instructions emitted by newer compilers. Our Rust-target run did not exercise those C++ paths or measure parsing speed.

The project claims 4x speed by changing how you read JSON

simdjson's README says it parses more than 4 times faster than common production parsers, with higher figures for individual jobs such as UTF-8 validation. We did not reproduce those benchmarks. The useful design fact is that the default On-Demand API avoids building a complete tree. A document is an iterator over the original text, so the parser can skip values that the application never asks for. Less work is the source of much of the appeal.

That bargain changes application code. The parser instance, input string, and document must stay alive during parsing, and one parser can have only one open document. Returned string_view values can point into the source or a temporary parser buffer. Parsing another document can invalidate them. The basics guide explains these rules clearly, but a team used to retained DOM values still has to design around them.

One header and one source file cover the basic C++ path

A release includes simdjson.h and simdjson.cpp, which can be copied into a C++ project and compiled with the application. The documented floor is GCC 7.4, Clang 6, Xcode 11, or Visual Studio 2017, depending on platform. CMake, package-manager, submodule, and FetchContent routes are also documented. Runtime CPU detection selects an implementation, so the maintainers advise against architecture-specific compiler flags when one binary must run across several machines.

Input handling is the part to review before adoption. On-Demand always needs padded input, though C++17's padded_input can manage that automatically. A user-owned buffer needs extra SIMDJSON_PADDING bytes. The DOM API has a separate unpadded route. Development checks can catch incorrect iteration patterns, while release builds should define NDEBUG to avoid their cost. These are workable rules, but they belong in code review and tests, not tribal memory.

What happened when we ran it

Our run at commit 23b236d used the Rust project under benchmark/static_reflect/serde-benchmark/, inside an unprivileged container with 3 CPUs and 12 GB of RAM. Installation completed in 1 second and added 15 packages. The build succeeded in 7 seconds. The repository checkout contained 773 files, about 119,390 source lines, and occupied 34.2 MB before those packages. Our scan found 44 CI workflow files and a tests directory.

cargo test exited successfully after 1 second, reporting 0 passed and 0 failed out of 0 tests. That is an empty test run, not evidence that the core C++ parser passed its suite. Our test method followed the detected nested Rust target, so it also did not compile the single-header C++ path, exercise runtime CPU selection, validate padded-buffer behavior, or measure JSON throughput. The honest result is that one ancillary benchmark crate built cleanly.

Version 4.6.11 fixed six parser defects

The latest release, v4.6.11, was published on September 5, 2026 and lists 6 fixes from an audit. They include silent truncation of a root scalar at a parse_many window boundary, an out-of-bounds write when maximum depth was zero, and a source-view length underflow across batches. The release also corrected a UTF-8 window-edge case, 32-bit capacity guards, and allocation-failure state. Those are strong reasons to pin a current release.

The maintainers say the development branch may contain extra bugs and tell production users to work from releases with matching documentation. Follow that advice. A parser sits on an untrusted-data boundary in many systems, and v4.6.11 shows that obscure window and allocation cases matter even in a mature project. Build regression inputs from your traffic, fuzz the options you enable, and review release notes before upgrading or holding back.

JSONPath and compressed input still have hard limits

The documented at_path() method supports the subset of JSONPath that can be converted to JSON Pointer. Full JSONPath remains requested in issue 2070. The current path call can rewind the parser and invalidate previously read values, so callers must consume results between calls. That is quite different from keeping a tree and issuing arbitrary queries against it. Choose the API because the access pattern fits, not because the library tops a chart.

Compressed input is another boundary. Issue 1020 says applications currently decompress a JSON document before parsing it. The performance guide also notes that densely packed floating-point numbers can become the limiting work. Benchmark decompression, allocation, parsing, and value extraction together on the CPUs you deploy. simdjson is the right candidate when that full measurement shows a win and the 64-bit C++ integration rules remain acceptable.

September activity makes comparison cheap

GitHub recorded a push on September 25, 2026. The repository had 24,272 stars, 73 combined issues and pull requests, and 56 open issues when fetched. The same month brought v4.6.11 and its 6 audit fixes. That combination shows active maintenance and active scrutiny. The dual Apache-2.0 or MIT choice also removes most licensing friction for a technical trial.

Try simdjson beside yyjson, RapidJSON, and JSON for Modern C++ using representative payloads and the queries your application actually makes. Keep correctness checks identical, include allocation and decompression costs, and record the CPU model. If the profiler cannot show a meaningful end-to-end gain, the easier object model is the better engineering choice. If it can, On-Demand's lifetime rules are a fair price for measured savings.

Alternatives

ProjectWhat it isPick it when
yyjsonA compact C JSON library with mutable and immutable document APIs.pick this instead when a C API and a conventional document model fit your code better.
JSON for Modern C++ gh↗A C++ JSON library built around familiar containers and expressive syntax.pick this instead when readable application code matters more than maximum parser throughput.
RapidJSONA C++ parser and generator with SAX and DOM interfaces.pick this instead when you want an established SAX or DOM API and your measurements do not justify On-Demand semantics.

What people are saying

  1. [velocity-scout] simdjson/simdjson

Sources

  1. simdjson README
  2. simdjson basics guide
  3. simdjson performance guide
  4. Release v4.6.11
  5. Full JSONPath issue 2070
  6. Compressed input issue 1020
  7. Measured commit 23b236d
  8. MrKeyoor test method

More data reviews

go-stock · sqlitebrowser · hydradb · DouYin_Spider · helix-db · abu · the whole board →