Moje trampoty s novým JSON source generator v ASP.NET API

Novinkou v .NET 6 je nový C# JSON generátor. Benchmarky sľubovali v určitých prípadoch až ~40% nárast výkonu pri serializácií (Napríklad tu.).

Chcel som vyskúšať aký to bude mať dopad pri reálnom použití v ASP.NET API službách. Použitie malo byť jednoduché:

builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.AddContext<InvoiceJsonContext>();
});

Neočakával som 40% nárast výkonu 🙂, ale dúfal som, že sa to aspoň čiastočne odzrkadlí na odozve?, priepustnosti?, znížení pamäťových nárokov?, ...? aspoň na niečom! Ale nič, môj experiment neukazoval takmer žiadne rozdiely s alebo bez použitia vygenerovaného contextu. Najskôr som predpokladal, že je chyba na strane môjho experimentu (nedokážem vygenerovať relevantnú záťaž, testovacie dáta nie sú dostatočne komplexné, ...). Ale ani po vyskúšaní viacerých možností sa mi nepodarilo dospieť k uspokojivým výsledkom.

A tak som začal zisťovať či sa ten vygenerovaný kontext vôbec používa. Po ďalších pokusoch a dlhšom skúmaní som zistil, že môj kontext sa síce zaregistruje, ale pri deserializácií sa vôbec nepoužije. Pri debugovaní ASP.NET som narazil na to, že pri vytváraní triedy SystemTextJsonOutputFormatter zodpovednej za serializovanie odpovede, sa neprevezme zaregistrovaný kontext.

Už som chcel ísť písať issue, keď som zistil, že už taká existuje 🙃 (JsonSerializerOptions constructor is not copying the contex).

Záver?

Najskôr googli až potom rob vlastné výskumi 😀 To je záver pre mňa.

JSON serializácia / deserializácia sa v ASP.NET Core deje neustále a preto JSON source generátor je práve tá vec, ktorá by mohla pomôcť výkonu naších API. Tým, že sa aktuálne pri GET požiadavkách nepoužije (pri bežných API prevláda počet GET požidaviek nad POST / PUT) to ale zatiaľ ešte nepocítime. Možno v .NET 7?

K danému experimentu sa opäť vrátim po vyriešní danej issue 😉.