Найти тему

Новый System.Text.Json source generator

На основе статьи Try the new System.Text.Json source generator.

Снова про производительность и про source generators.

Ещё в .net core 3.0 был представлен новый встроенный в .net механизм работы с Json — System.Text.Json. Изначальным фокусом новой функциональности была высокая производительность. В .net долгое время был стандарт де-факто для работы с json: библиотека Newtonsoft.Json. Легко встраиваемый в аспнет, функциональный, с некоторыми особенностями, которые тоже успели стать стандартными при работе с жсоном в дотнете.

Из-за фокуса на производительности и следовании стандартам json System.Text.Json имеет некоторую несовместимость с Newtonsoft.Json. Про различия между библиотеками и миграции есть отдельная статья от MS.

В общем случае можно сформулировать так — при общении нескольких сервисов им стоит работать на одной библиотеке и мигрировать их стоит тоже вместе; в существующем легаси проекте особенно с сложной логикой сериализации миграция на System.Text.Json может вызвать проблемы. Есть даже отдельные статьи про миграцию, например, ASP.NET Core 6 MVC Upgrade System.Text.Json Serialization Issues.

Мотивация перехода на System.Text.Json — это производительность. Есть несколько бенчмарков (раз, два), которые дают среднюю оценку о вдвое большей производительности нового механизма при меньшем числе аллокаций.

-2
-3
-4

Есть способ ещё ускорить сериализацию-десерализацию Json с System.Text.Json — это source generators. В статье описаны новые сорс генераторы в дотнет 6, которые позволяют генерировать оптимизированную логику сериализации для типов и контекст сериализации. В общем виде использование генератора выглядит так:

-5

А использование результатов работы генератора выглядит так:

-6

Но нам ведь интересно использование новых генераторов под капотом aspnet. Для этого есть необходимые апи, достаточно добавить контекст сериализации один раз:

-7

Сколько можно выиграть в результате использования сорсгенераторов. Бенчмарки показывают прирост производительности для объектов и коллекций в 2 раза по сравнению с стандартной сериализацией на System.Text.Json. То есть, в сравнении с Newtonsoft.Json прирост будет уже в 4 раза:

-8

Предыдущий пункт может быть непоказательным — непонятно какую долю сериализация занимает в общем процессе работы механизмов аспнет и на сколько ускоряется приложение в целом. Есть бенчмарк производительности веб-фреймворков (его интересно посмотреть потому что он сравнивает не только дотнет-фреймворки), который измеряет производительность запросов по извлечению кэшированных данных — то есть, выполняет жсон-сериализацию кэшированных данных и отправляет их в тестового клиента. Вот сравнение производительности дотнет5, дотнет6 и дотнет6 с использованием новых сорсгенераторов:

-9

Новые сорсгенераторы дают прирост производительности на 100к RPS, то есть, примерно на 40%.

Telegram-канал Ростовского .net-сообщества