19-летняя девушка-разработчик ускорила serde_json на 32% и рассказала, как достигла этого

Обложка: 19-летняя девушка-разработчик ускорила serde_json на 32% и рассказала, как достигла этого

Алиса Сиренева — 19-летняя разработчица из Москвы. В своем блоге она опубликовала пост, в котором рассказала, как, работая с библиотекой serde_json — стандартом де-факто для сериализации и десериализации JSON в экосистеме Rust, она заметила значительное замедление при обработке ошибок.

Это вызвало у нее интерес к анализу и поиску оптимизаций, особенно после использования новой библиотеки #[iex], которая фокусируется на улучшении обработки ошибок.

Анализ показал, что путь обработки ошибок в serde_json в два раза медленнее успешного, и основной причиной этого стала функция position_of_index, ответственная за определение позиции строки и колонки в случае ошибки.

Ключевые выводы

19-летняя разработчица Алиса Сиренева из Москвы ускорила популярную Rust-библиотеку serde_json на 32% с помощью SIMD и SWAR-оптимизаций.

Узкое место нашлось в функции position_of_index — она замедляла путь обработки ошибок в два раза по сравнению с успешным путём.

Ключевое решение — замена медленного линейного поиска на библиотеку memchr, использующую SIMD-инструкции процессора для ускорения поиска символов.

Все изменения приняты в основную ветку serde_json и доступны миллионам Rust-проектов по всему миру.

Решение через оптимизацию

Чтобы устранить узкое место, разработчица предложила заменить функцию position_of_index на более эффективную реализацию с использованием библиотеки memchr, которая задействует SIMD-инструкции для быстрого поиска символов.

Это привело к значительному ускорению обработки ошибок, практически устранив разницу в скорости между успешным и ошибочным путями. Эта оптимизация была одобрена и принята сообществом разработчиков serde_json.

Новые горизонты оптимизации

Воодушевленная успехом, девушка продолжила поиск возможностей для улучшений. Ее внимание привлекли циклы, ответственные за парсинг строк, которые также можно было оптимизировать с помощью SIMD и SWAR (SIMD Within A Register).

Хотя не все предложенные методы показали себя одинаково эффективно, использование SWAR оказалась более продуктивным и привело к значительным улучшениям производительности.

Часто задаваемые вопросы
1
Что такое serde_json и зачем её оптимизировать?

serde_json — самая популярная библиотека для работы с JSON в Rust, её используют десятки тысяч проектов. Любое ускорение напрямую влияет на производительность серверов, микросервисов и инструментов, обрабатывающих большие объёмы JSON-данных. Именно поэтому даже незначительное улучшение в такой базовой библиотеке имеет огромный практический эффект.

2
Что такое SIMD и как оно ускоряет обработку строк?

SIMD (Single Instruction, Multiple Data) — это набор процессорных инструкций, позволяющих обрабатывать несколько байт данных за одну операцию. При поиске символа в строке обычный код проверяет байты по одному, тогда как SIMD проверяет сразу 16–32 байта. Библиотека memchr использует эти инструкции автоматически, обеспечивая до 10x ускорение поиска по сравнению с наивной реализацией.

3
Что такое SWAR-оптимизация и чем она отличается от SIMD?

SWAR (SIMD Within A Register) — техника, эмулирующая параллельную обработку данных внутри одного целочисленного регистра без специальных SIMD-инструкций. Она переносима, работает на любом процессоре и позволяет обрабатывать 4–8 байт за одну операцию. В отличие от SIMD, SWAR не требует процессорных расширений вроде SSE или AVX, что делает её универсальным вариантом для оптимизации парсинга строк.

4
Как молодой разработчик может внести вклад в популярную open-source библиотеку?

История Алисы Сиреневой — хороший пример: начните с профилирования реального кода и поиска узких мест, напишите benchmark, предложите конкретное решение с измеримым улучшением. Сообщество open-source ценит не возраст, а качество исследования и чистоту реализации. Большинство мейнтейнеров крупных библиотек с удовольствием принимают хорошо обоснованные PR от новых контрибьюторов.

По итогу идеи, предложенные Алисой, показали прирост скорости работы serde_json до 32% в различных тестах, связанных с обработкой строк.

Эти изменения существенно повышают производительность библиотеки и положительно сказываются на многих проектах, использующих ее.