V8's faster JSON rewards a clear data boundary
V8’s JSON fast path favors plain data without serialization side effects. Check eligibility and runtime versions before replacing the built-in serializer.
Before replacing JSON.stringify with a custom serializer, establish what your application actually asks serialization to do. Plain data and objects that execute custom behavior during serialization present different engineering problems. V8’s faster path makes that boundary worth understanding, while supplying no reason to remove behavior the product relies on merely to pursue a benchmark number.
The V8 article published on 4 August 2025 reports more than twice the performance on JetStream2’s json-stringify-inspector benchmark, available starting with V8 13.8, corresponding to Chrome 138. That is an engine team’s reported benchmark improvement. It is not a measured improvement in an AL+ application, every browser, or an entire request-response cycle. This November 2026 retrospective concerns the adoption decision behind the result.
The post describes an iterative, side-effect-free fast path with fallback to the general serializer. Its documented conditions exclude replacer and space arguments, custom toJSON behavior on objects or prototypes, and indexed properties on ordinary objects. Some internal string representations also require fallback. These are eligibility limits, not a new permission to change JSON output semantics.
Plain data makes the boundary visible
A serializer may look like the final mechanical step after the application has done its work. If reading the object can execute behavior, however, the serialization step participates in producing the value. A review needs to account for that behavior before treating the object as an inert record ready for transport.
One design option is to construct an explicit transport value at a visible application boundary. That makes the selected fields and their meaning easier to inspect. It can also make serialization eligibility easier to reason about. This is an architectural option, not evidence that creating another object will make the complete operation faster.
Copying has a cost, and transforming a domain object can itself be substantial work. If the existing object already meets the product’s contract, another layer may be needless. Choose the boundary because it clarifies responsibility or because representative measurements justify it. Do not add a conversion pass simply because a fast-path description makes plain objects sound universally cheaper.
Falling back preserves behavior
The general serializer exists to handle cases the specialized path cannot safely assume away. A fallback is therefore not automatically a failure. It may be the correct execution of a required transformation, formatting choice or supported object shape. Calling it slow does not decide whether the application should stop requesting that behavior.
For example, if a product depends on a custom serialization method to choose its external representation, removing that method can change the contract. The relevant comparison includes both the old representation and the new one. Faster output with missing or differently interpreted fields would not satisfy the original requirement.
Likewise, compact transport and readable diagnostic output can have different purposes. A formatting argument in a diagnostic path need not be removed because a compact API path has different priorities. Separate consequential workloads instead of optimizing every call according to one engine’s favored case.
String representation is not a content policy
V8 describes specialized one-byte and two-byte stringifiers, with a transition when two-byte strings appear. It also discusses internal strings such as ConsString that may need flattening and cause fallback. Two-byte text is therefore not, by itself, a reason to conclude that the optimized path is unavailable.
This distinction matters for multilingual software. Removing Romanian diacritics to chase a serialization assumption would damage the data contract without establishing a product improvement. Internal engine representation and the information users need are separate concerns. Keep the text correct and measure the actual serialization path if it is consequential.
The internal representation can also be difficult for an application developer to control directly. Designing a brittle preparation step around an implementation detail may create more maintenance work than it saves. Prefer a straightforward data model unless evidence from the supported runtime and workload gives a concrete reason to specialize.
A benchmark does not describe the whole request
An API response also needs its data prepared and delivered. A faster serialization step changes only the part of elapsed time spent there. If another stage dominates, even a large improvement within the serializer may make a modest difference to what the user experiences. No application-level percentage follows from V8’s headline alone.
Identify the runtime actually executing the workload. A browser version and a server runtime do not become equivalent merely because both use JavaScript. Confirm the included engine version and the deployment’s update path before assuming the optimization is present. The article’s V8 version statement is a starting condition, not an inventory of your servers.
Then collect evidence from representative data and the complete relevant operation. Include output size and correctness, as well as elapsed time. This article conducts no local benchmark. It proposes a comparison that can answer whether serialization is worth changing in the application rather than simply reproducing an attractive engine result.
Custom serialization still has a case
The strongest counterargument is a workload with a defined schema, a demonstrated serialization bottleneck and a specialized implementation that already preserves the required output. Replacing it with the built-in solely because V8 improved would be just as speculative as replacing the built-in without measurement. Compare the supported versions and maintenance burden alongside performance.
A custom implementation also becomes a responsibility when data types or schemas change. Someone must preserve its contract and investigate mismatches. Native serialization reduces some of that application-owned machinery, but it does not choose which fields are appropriate to expose. Data ownership remains an application decision in either case.
For custom software development, begin with the required representation and the runtime you ship. Keep plain-data boundaries where they help clarity, retain necessary custom behavior and measure the path that matters. V8’s August work strengthens the case for checking the built-in before adding machinery. It does not turn an engine benchmark into a product promise.
Paul