Go 1.27 JSON Unmarshaling: encoding/json/v2 Guide 2026

Go 1.27 makes encoding/json/v2 stable and moves the classic encoding/json onto the v2 engine. Here are the three implementations, the real benchmark numbers, and how to measure decoding on your own payloads.
— Estimated reading time: 18 minutes
cover

Go 1.27 shipped in August 2026 with a significant change to how JSON works in Go. The encoding/json/v2 package is now stable in the standard library, and the old encoding/json package is now backed by the new v2 engine. For teams working on Go 1.27 JSON unmarshaling, this means something concrete: existing code gets a partial speedup without touching a single line. But if you want the full benefit - and to understand the trade-offs - you need to know what's actually changed.

This article explains the three distinct JSON implementations that now exist in Go 1.27, what the real benchmark numbers look like (including where the official claim of "at parity" for marshal is misleading), how to measure JSON performance on your actual workload, and how to decide between the standard library and third-party alternatives.

What Changed in Go 1.27: Three JSON Implementations

After years of community work and an experimental period starting with go-json-experiment, Go 1.27 ships three distinct JSON realities:

1. The original v1 engine. Still accessible, but only if you opt out via GOEXPERIMENT=nojsonv2 go build. This flag will be removed in a future release. For most teams, this path is irrelevant.

2. encoding/json backed by the v2 engine - the new default. If you do nothing, your existing Go code running on Go 1.27 uses the new v2 engine underneath the familiar encoding/json API. Same function signatures, same import path, same behavior - just faster for many workloads. Zero code changes required.

3. Direct encoding/json/v2. A new package with a new API and stricter default semantics. This is where the full v2 benefits live, along with some breaking behavioral changes compared to v1.

Here is what the import difference looks like in practice:

// Go 1.27 stdlib - v1 API, v2 engine underneath
// No code changes needed. Existing code just gets faster.
import "encoding/json"

var result Order
err := json.Unmarshal(data, &result)

// Direct v2 API - new package, new semantics
import jsonv2 "encoding/json/v2"

var result Order
err := jsonv2.Unmarshal(data, &result) // same function name, different package and behavior

The distinction matters for how you reason about migration. If your code imports encoding/json, you get the free speedup in Go 1.27 without any changes. If you want RejectUnknownMembers, streaming via UnmarshalRead, or the stricter UTF-8 and duplicate key handling - you need to explicitly import encoding/json/v2.

Why the v2 Engine Is Architecturally Different

The v1 engine had known design flaws. Custom MarshalJSON/UnmarshalJSON implementations caused quadratic performance behavior in recursive calls because JSON values were double-parsed. The v1 encoder accepted invalid UTF-8 and duplicate object keys - both are correctness problems, not just performance ones. Case-insensitive name matching in v1 was implemented inefficiently and created a subtle security surface.

The v2 engine separates syntactic concerns (encoding/json/jsontext) from semantic ones (encoding/json/v2). The jsontext.Decoder is truly streaming - it processes tokens in fixed memory regardless of document size. The v1 Decoder.Decode buffered entire JSON values before processing them.

Why json/v2 Can Be Faster - and Sometimes Isn't

The Go 1.27 release notes say: "unmarshal performance is significantly faster" and "marshal performance is broadly at parity." Both statements are directionally correct, but neither is the full story.

What the pre-release benchmarks showed. The go-json-experiment/jsonbench project measured the v2 engine against the v1 engine using Go 1.23.5 and an experimental v2 snapshot from January 2025 - not the Go 1.27 release. Those numbers: 2.7x to 10.2x faster for concrete-type unmarshal, 2.3x to 5.7x faster for interface-type unmarshal. The 10x figure appears in RawValue (decoder-only) benchmarks where reflection cost is eliminated. These are directional indicators of what the new engine can do, not production projections for your workload.

What Go 1.27 actually delivers. Daniel Lemire ran independent benchmarks in August 2026 on Go 1.27.0 using real-world JSON datasets (twitter.json at 632 kB, citm_catalog.json at 1.73 MB, canada.json at 2.25 MB) on both Apple M4 Max and Intel Xeon Gold 6548N hardware.

For the legacy encoding/json API on the v2 engine (what you get for free in Go 1.27 without any code changes):

  • twitter.json unmarshal any: 172 MB/s → 203 MB/s (+18%)
  • citm_catalog.json unmarshal any: 186 MB/s → 241 MB/s (+30%)
  • canada.json unmarshal any: 128 MB/s → 106 MB/s (-17%)

The canada.json regression matters: this dataset is geometry-heavy with deep numeric arrays. Not every workload benefits from the new engine.

Switching to the direct json/v2 API adds another 1.8x to 2x unmarshal speedup on top of the legacy API gains, for any-typed decoding - bringing the total to roughly 1.5x to 2.3x faster than the original v1 engine.

The marshal story is different. The official "broadly at parity" claim does not hold for typed struct marshaling in Lemire's tests. Marshal of typed structs with json/v2 was approximately 1.5x slower than the original v1 engine. Marshal of any was 1.2x to 3x faster with v2.

The takeaway: unmarshal gains are real. Marshal behavior is workload-specific. If your service is write-heavy with typed struct payloads and latency-sensitive, benchmark carefully before assuming v2 is an improvement across the board.

Stricter Behavior: What v2 Enforces by Default

Switching to direct json/v2 semantics changes how your code handles edge cases that v1 silently accepted.

Duplicate JSON object keys - v2 rejects them by default. v1 accepted duplicates and used the last value. If your upstream sends malformed JSON with duplicate keys, v2 will return an error where v1 silently succeeded.

Invalid UTF-8 - v2 rejects invalid UTF-8 in strings. v1 accepted it. This is a correctness guarantee, but it means any upstream sending non-UTF-8-safe JSON will start failing.

Case-sensitive name matching - v2 matches struct field names case-sensitively by default. v1 was case-insensitive. This affects any code that relied on fuzzy field matching. You can restore the v1 behavior with MatchCaseInsensitiveNames(true), but it comes with a performance cost.

Unknown fields - both v1 and v2 default to silently ignoring unknown JSON fields. In v2, you can enable strict rejection:

import jsonv2 "encoding/json/v2"

opts := jsonv2.RejectUnknownMembers(true)
if err := jsonv2.UnmarshalOptions(opts, data, &result); err != nil {
    // unknown field in JSON → error, not silent skip
    return err
}

For B2B integrations, RejectUnknownMembers is valuable. If a partner API starts sending new fields that your struct doesn't handle, silent drops mean you might miss the change entirely. With rejection enabled, you get a clear error that forces you to explicitly decide what to do.

Streaming JSON: UnmarshalRead and UnmarshalDecode

The json/v2 API adds functions that work directly with io.Reader rather than byte slices. For HTTP services, this matters.

UnmarshalRead decodes from an io.Reader and, critically, rejects trailing data after the JSON value. The v1 pattern of json.NewDecoder(r).Decode(&v) silently ignores anything after the first JSON value - a common source of subtle bugs when receiving malformed HTTP responses.

import (
    jsonv2 "encoding/json/v2"
    "net/http"
)

func parseResponse(resp *http.Response) (*Order, error) {
    var order Order
    if err := jsonv2.UnmarshalRead(resp.Body, &order); err != nil {
        return nil, err
    }
    return &order, nil
}

UnmarshalDecode is the choice for event streams, NDJSON (newline-delimited JSON), or any scenario where you need to read multiple JSON values from a single reader sequentially. It takes a jsontext.Decoder, which gives you fine-grained control over decoding options.

The jsontext.Decoder itself is truly streaming - it processes tokens in fixed memory regardless of how large the total document is. This is a real improvement over v1's Decoder, which buffered entire JSON values before handing them to the semantic layer.

Custom Unmarshaling with UnmarshalerFrom and WithUnmarshalers

When you need custom decoding logic - handling non-standard date formats, domain-specific types, or conditional parsing - v2 gives you two mechanisms.

The UnmarshalerFrom interface lets a type implement its own decoding with full access to the jsontext.Decoder:

type CustomDate struct {
    time.Time
}

func (d *CustomDate) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
    var s string
    if err := jsonv2.UnmarshalDecode(dec, &s); err != nil {
        return err
    }
    t, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    d.Time = t
    return nil
}

WithUnmarshalers lets you inject custom unmarshaling for specific types without modifying the types themselves - useful when working with types you don't own:

opts := jsonv2.WithUnmarshalers(
    jsonv2.UnmarshalFromFunc(func(dec *jsontext.Decoder, t *time.Time) error {
        var s string
        if err := jsonv2.UnmarshalDecode(dec, &s); err != nil {
            return err
        }
        parsed, err := time.Parse(time.RFC3339, s)
        if err != nil {
            return err
        }
        *t = parsed
        return nil
    }),
)
err := jsonv2.UnmarshalOptions(opts, data, &result)

This replaces the v1 pattern of implementing UnmarshalJSON([]byte) error, which forced you to re-parse the raw bytes passed to you - the double-parse problem that contributed to quadratic behavior in v1.

Benchmarking JSON on Your Real Project

The benchmark numbers above - whether from jsonbench, Lemire, or any other source - were measured on specific hardware, specific datasets, and specific type structures. They will not predict what happens in your service.

If JSON parsing is a meaningful cost in your system, measure it yourself. Here is a template:

func BenchmarkUnmarshalOrder(b *testing.B) {
    data := []byte(`{"id": 42, "items": [{"sku": "X1", "qty": 3}], "total": 1234.56}`)
    b.ReportAllocs()
    for b.Loop() {
        var order Order
        _ = json.Unmarshal(data, &order)
    }
}
// Run: go test -bench=. -benchmem -count=10 | benchstat -

Three things to get right:

Use b.ReportAllocs(). Allocation count often matters as much as throughput. Fewer allocations means less GC pressure, which matters more in high-load services than raw throughput numbers suggest.

Use -count=10 and benchstat. A single benchmark run is noisy. benchstat computes a statistical summary across multiple runs and tells you whether a difference is real or within noise. Install it with go install golang.org/x/perf/cmd/benchstat@latest.

Use your actual payloads. The difference between a 100-byte flat struct and a 10 kB nested document is not linear. If your service processes ERP payloads with 50-field structs and nested arrays, benchmark those, not a synthetic {"id": 1} response.

What Benchmark Results Actually Show

When you run benchmarks on your own service, you are measuring the intersection of several factors: document size, nesting depth, ratio of string to numeric fields, proportion of interface vs concrete types in your struct, and allocation patterns.

String-heavy documents benefit significantly from the v2 engine's improved memory reuse. Numeric-heavy documents (like the canada.json geometry data in Lemire's test) may not benefit at all. Interface-typed fields (any, interface{}) see the largest relative gains with direct v2 API usage.

ByteDance has reported internally that JSON processing accounts for roughly 10% of CPU in their typical services and over 40% in extreme cases - but this is vendor-reported data from a company that builds Sonic, and their "extreme" cases are not representative of most B2B backends. The relevant question is not "how much does JSON cost at ByteDance" but "what does profiling show in your service."

A quick profiling check before committing to any JSON optimization:

go test -cpuprofile=cpu.out -bench=.
go tool pprof -top cpu.out | grep -i json

If JSON isn't in the top 10 functions by CPU time, optimizing it is unlikely to matter.

Impact on B2B, ERP, and High-Load Systems

For most B2B and ERP integrations, the performance story of Go 1.27 JSON is simple: upgrade to Go 1.27, get the free unmarshal improvement, and move on. The 18%-30% improvement in throughput on any-typed decoding (per Lemire's results on twitter.json and citm_catalog.json datasets) is real and costs nothing.

The more interesting question for enterprise Go systems is not raw speed - it is correctness.

B2B integrations break in a specific way: an upstream partner adds or renames a field, your code silently ignores the change, and you don't find out until business logic fails downstream. The RejectUnknownMembers option in json/v2 gives you a tool to catch this at the boundary. You can enable it in staging with strict rejection, and in production with logging-only mode, so you know when contracts drift.

For event-driven systems processing large volumes of messages - order processing, inventory updates, document workflows, or the event pipelines behind digital marketing analytics - the streaming improvements in json/v2 matter structurally. Fixed-memory token processing via jsontext.Decoder means you can process large JSON event streams without buffering the entire document. For services running millions of requests per day, reduced allocation pressure translates to lower GC pause frequency and more predictable latency.

For low-traffic internal services - an admin API that handles a few hundred requests per day - none of this is relevant. The same holds for most corporate sites delivered as part of ordinary web design & development services: JSON parsing is nowhere near the critical path. Profile first.

Where the 18%-30% improvement actually matters: an API gateway handling 50,000 JSON unmarshal operations per second will process roughly 9,000 to 15,000 more requests per second for free on Go 1.27, without any code changes. At that scale, the compounding effect on infrastructure cost and latency percentiles is measurable - and on public endpoints those percentiles feed straight into the page speed signals that seo work depends on.

Where it doesn't matter: a nightly batch job that imports 5,000 ERP records. The latency here is dominated by database writes and network round trips, not JSON parsing.

At Webdelo, our default approach for Go projects is to profile production workloads before making any optimization decisions. The same discipline governs every Web Development engagement we take on: measure first, change code second. JSON performance becomes relevant when it shows up in pprof flame graphs - and when it does, we benchmark against the actual payload format, not synthetic data. We've worked on enough B2B integrations and ERP systems to know that "JSON is slow" is rarely the bottleneck, but when it is, it shows up clearly.

Third-Party JSON Libraries: Practical Comparison

With encoding/json/v2 now in the standard library, the case for third-party JSON libraries has narrowed. Here is where each one stands.

Library Approach Performance vs json/v2 Status
Sonic (ByteDance) JIT + SIMD Up to 2.8x faster unmarshal Active, Go 1.27 compatible
segmentio/encoding Unsafe reflection Up to 1.9x faster unmarshal Active
easyjson Code generation 4-5x faster (claim), no reflection Active (March 2026 release)
goccy/go-json Unsafe reflection 1.3x to 1.8x faster unmarshal Active, known failures
json-iterator/go Reflection override 1.3x faster to 1.5x slower Archived Dec 2025
GJSON / jsonparser Selective parsing Not comparable Active

Sonic

Sonic uses JIT compilation and SIMD instructions to generate machine code specialized per Go type at runtime. On amd64 and arm64, this is the fastest option available - up to 2.8x faster than json/v2 for concrete-type unmarshal.

The trade-offs are significant. Sonic uses unsafe and does not validate UTF-8 in JSON strings. If your B2B integration receives JSON from partners with non-ASCII data, Sonic will silently accept invalid UTF-8 that json/v2 would reject. It only runs on amd64 and arm64 - fall back to stdlib on other architectures happens automatically, but cross-platform consistency is lost. It also has a runtime ABI dependency that means Go 1.24.0 was unsupported (1.24.1+ works) and future Go releases may introduce similar compatibility windows.

We would choose Sonic only when: profiling has identified JSON as a real bottleneck, the service runs exclusively on amd64 or arm64, the team accepts the correctness trade-off on UTF-8, and the performance gain is verified on production-representative payloads.

segmentio/encoding

A drop-in replacement for encoding/json. Up to 1.9x faster unmarshal than json/v2 in benchmarks, up to 2.0x faster for raw value processing. Uses unsafe. No streaming marshal or unmarshal support.

For teams that need more performance than the standard library and don't want the complexity of Sonic's JIT approach, segmentio is a reasonable choice. The API is identical to encoding/json, so migration is mechanical.

easyjson

easyjson generates Go code at build time that handles marshaling and unmarshaling without reflection. The generated code is fast - claimed 4-5x faster than encoding/json v1, though benchmarks are workload-specific.

The cost: you run easyjson -all . to generate files, commit the generated code, and re-run generation when structs change. This is a real maintenance burden, especially for evolving schemas. For a B2B integration where the JSON schema changes when upstream partners update their API, the generated code needs to stay in sync.

easyjson is a good choice for stable, high-volume schemas: fixed message formats, fixed-schema event types, or performance-critical hot paths with predictable structure. Last published March 2026, actively maintained.

goccy/go-json

Faster than json/v2 for concrete unmarshal (1.3x to 1.8x), uses unsafe, API-compatible with encoding/json. The correctness caveat is significant: the jsonbench suite documents non-deterministic failures including SliceEnd opcode not implemented and invalid character ',' after object key in some interface-type marshaling scenarios.

Non-deterministic failures are particularly problematic in production. A bug that reproduces reliably is debuggable. One that surfaces intermittently under specific data patterns is not. We would not use goccy/go-json in a production B2B system until these issues are resolved and verified in the library's test suite.

json-iterator/go

Archived by its owner on December 15, 2025. The repository is read-only. Do not use it for new projects. If you have existing code using json-iterator, it will continue to compile, but you are accumulating technical debt with no upstream support.

GJSON and jsonparser

These are selective parsers - they let you extract specific fields from JSON without deserializing the full document. The API is entirely different from encoding/json. You would use GJSON or jsonparser when you need to read 2-3 fields from a 200-field JSON payload and allocating the full struct is wasteful.

They are not replacements for Unmarshal. If you need full document deserialization, use json/v2 or one of the libraries above.

Which JSON Library We'd Choose for a New Corporate Go Project

For a new Go project in 2026 - B2B integration, ERP backend, enterprise API, or high-load service - our default is encoding/json/v2 with direct v2 import. Not because it's the fastest option, but because it gives the best combination of correctness guarantees, standard library stability, zero external dependencies, and good performance.

The correctness guarantees matter more in enterprise contexts than raw throughput. Strict UTF-8 validation, duplicate key rejection, and RejectUnknownMembers catch integration problems at the boundary. These are features you would otherwise build manually on top of v1.

When we would add Sonic: we've measured a real JSON bottleneck in production pprof, the service runs on amd64 or arm64, the team has explicitly accepted the UTF-8 trade-off, and we've validated the performance gain on production payloads. This scenario is rare.

When we would use easyjson: fixed schema, high volume, the performance requirement is clear and measured, and the team is comfortable with a code generation step in the build.

We would skip: json-iterator (archived), goccy/go-json (correctness risk in production).

Migrating an Existing B2B System to json/v2

If you have an existing system and want to adopt v2 semantics incrementally, the migration path has four steps.

Step 1: Upgrade to Go 1.27 and take the free speedup. Your encoding/json imports now use the v2 engine with v1 semantics. No code changes, partial unmarshal improvement.

Step 2: Use DefaultOptionsV1() when calling v2 APIs. This is the compatibility layer that makes v2 behave identically to v1. It's safe as a first step because it's literally what encoding/json uses internally in Go 1.27.

import (
    jsonv2 "encoding/json/v2"
    jsonv1 "encoding/json"
)

// Identical behavior to encoding/json, but using v2 API
jsonv2.Unmarshal(data, &v, jsonv1.DefaultOptionsV1())

// Enable v2 behaviors one at a time, in order
jsonv2.Unmarshal(data, &v, jsonv1.DefaultOptionsV1(),
    jsonv2.RejectUnknownMembers(true))

Step 3: Use jsonsplit to detect behavioral differences. The jsonsplit package provides AutoDetectOptions, which runs both v1 and v2 semantics in parallel and logs cases where they produce different output. This is invaluable for finding where your existing data relies on v1 behavior (case-insensitive matching, duplicate keys, invalid UTF-8) before committing to v2 defaults. You can run this in shadow mode in production without changing behavior.

Step 4: Adopt v2 semantics where they add value. Once you know which code paths are clean, enable RejectUnknownMembers at API boundaries, switch HTTP response parsing to UnmarshalRead, and remove the DefaultOptionsV1() override for those paths.

The key principle: later options override earlier ones. You can enable v2 behaviors one at a time, in a controlled rollout. You don't need a big-bang migration.

Behavioral Changes That Can Break Existing Code

Before migrating, audit your codebase for these specific patterns:

  • Nil slices and maps: v1 marshals them as null; v2 marshals them as [] and {}. Any code that checks for null in JSON output needs review.
  • Case-insensitive field matching: v1 matched "OrderID" to a struct field named orderID. v2 requires exact case by default. If upstream partners send inconsistent casing, you need to add MatchCaseInsensitiveNames(true) explicitly.
  • Removed v2 options: if you were using the experimental v2 during the GOEXPERIMENT period, note that format and unknown struct tags, DiscardUnknownMembers marshal option, and SkipFunc sentinel error were removed before Go 1.27. The inline struct tag was renamed to embed.

Conclusion

Go 1.27's JSON changes are substantive. The free speedup from upgrading to Go 1.27 without code changes is real - 18% to 30% improvement on any-typed unmarshal for typical JSON datasets. The direct json/v2 API delivers more: 1.5x to 2.3x faster unmarshal versus the original v1 engine, plus stricter correctness guarantees.

But the marshal story is more complicated. For typed struct marshaling, json/v2 can be 1.5x slower than the original v1 engine. The official "at parity" claim doesn't hold for all workloads. Measure your specific case.

For new Go projects in 2026, encoding/json/v2 is the right default - not because it's universally fastest, but because it gives you correctness, standard library support, and good performance without external dependencies. Sonic and easyjson are valid for specific, measured scenarios. json-iterator is archived and should not be used for new work.

The broader lesson is the same one that applies to most performance decisions in enterprise Go systems: profile first, then benchmark your actual workload, then decide. A 30% unmarshal improvement is meaningful at 50,000 requests per second and irrelevant in a nightly batch job.

If you are building or optimizing a Go system - B2B integration, ERP backend, high-load API - and want a team that has done this in production, Webdelo has been building Go systems for B2B and enterprise clients since 2006. We don't optimize speculatively. We profile, measure, and make decisions based on what the data shows in your specific workload.

Frequently Asked Questions

What changed in Go 1.27 for JSON unmarshaling?

Go 1.27 ships three JSON realities. The familiar encoding/json package now uses the v2 engine underneath by default, giving existing code a free performance boost with zero changes required. A new direct encoding/json/v2 package is also available with a new API and stricter semantics - rejecting duplicate keys, invalid UTF-8, and using case-sensitive field matching by default. The original v1 engine remains accessible only via a GOEXPERIMENT opt-out flag that will be removed in a future release.

How much faster is encoding/json/v2 compared to v1?

The performance gains depend on workload type. Simply upgrading to Go 1.27 with no code changes gives 18-30% faster unmarshal on typical JSON datasets, though some geometry-heavy numeric payloads may regress by around 17%. Switching to the direct encoding/json/v2 API adds another 1.8x to 2x speedup on top of that for interface-typed decoding, totaling roughly 1.5x to 2.3x faster than the original v1 engine. Marshal performance is a different story: typed struct marshaling with json/v2 is approximately 1.5x slower than v1, while marshaling untyped values is 1.2x to 3x faster.

Should I switch from encoding/json to encoding/json/v2?

The answer depends on your needs. If you only want the performance boost, simply upgrading to Go 1.27 is enough - the encoding/json package automatically uses the v2 engine with no code changes required. Switch to the direct encoding/json/v2 package only when you need its stricter features: rejecting unknown JSON fields at API boundaries via RejectUnknownMembers, true streaming via UnmarshalRead, or enforced UTF-8 and duplicate key validation. The safest migration path is to start with DefaultOptionsV1() to maintain backward compatibility, then enable v2 behaviors one at a time after using the jsonsplit package to detect any behavioral differences in your existing code.

When should I use Sonic instead of encoding/json/v2?

Sonic should only be considered after profiling has confirmed that JSON processing is a genuine bottleneck in your service. Sonic uses JIT compilation and SIMD instructions to achieve up to 2.8x faster unmarshaling than encoding/json/v2, but it comes with significant trade-offs: it only runs on amd64 and arm64 architectures, it does not validate UTF-8 in JSON strings, and it has runtime ABI dependencies that can cause compatibility windows with new Go releases. For most B2B and corporate Go services, encoding/json/v2 delivers sufficient performance without these risks. Sonic is justified only when pprof data shows JSON in your top CPU consumers and the service runs exclusively on supported architectures.

Why is json-iterator/go no longer recommended?

json-iterator/go was archived by its owner on December 15, 2025, making the repository read-only with no further development or security updates. Beyond the abandonment, its performance advantage has also disappeared: benchmarks show it ranging from 1.3x faster to 1.5x slower than encoding/json/v2 depending on workload, meaning it no longer provides a meaningful speed benefit over the standard library. Existing code using json-iterator will continue to compile, but every dependency on it represents technical debt with no upstream support. For new projects, use encoding/json/v2 instead. For existing codebases, migrating away is the recommended path.

How do I benchmark JSON performance in my Go project?

Start with a profiling check before writing any benchmark: run go test -cpuprofile=cpu.out -bench=. and then go tool pprof -top cpu.out | grep -i json to see if JSON even appears in your top CPU consumers. If it does not, optimizing JSON is unlikely to matter. When you do benchmark, always call b.ReportAllocs() because allocation count affects GC pressure as much as raw throughput. Use -count=10 combined with the benchstat tool to get statistically meaningful results rather than single noisy runs. Most importantly, benchmark your actual production payloads - the performance difference between a 100-byte flat struct and a 10 kB nested ERP document is not linear, and synthetic benchmarks will not predict real-world behavior.

cookies We use Cookies

We use cookies to improve website performance, personalize content, and analyze traffic. You can choose which categories of cookies to allow. For more information, please see our Cookie Policy. You can change your preferences at any time.

Essential (Required)

Ensure the website functions properly (navigation, access to secure areas). Always enabled and can only be changed in your browser settings.

Analytics

Help us understand how you use the website so we can improve our services. Do not collect personal data. We use several analytics tools for this purpose.

Advertising

Used to deliver personalized ads and measure the effectiveness of advertising campaigns.