Главная/ Блог/ Rust vs. Go

Rust и Golang в 2025 году: сравниваем производительность

На основе доклада технического директора Evrone Александра Кириллова мы провели сравнение Go и Rust. Ниже рассмотрим реальные возможности, производительность и варианты использования каждой технологии.

November 2024

Противостояние Rust и Go обсуждают давно. Go, известный своей простотой использования и быстрым обучением, стал языком, к которому обращаются для высокопроизводительных внутренних служб. На другом конце спектра находится Rust, который быстро становится популярным, благодаря гарантиям безопасности памяти и нулевой стоимости абстракций.

Предыстория

В Evrone был практический опыт сравнения Rust и Go в больших масштабах для проекта клиента. Целью было создание сервиса для обработки данных JSON, их проверки, обогащения и хранения в ClickHouse для долгосрочной аналитики. Он должен был принимать, проверять, обогащать JSON-файлы и обеспечивать сохранность данных и высокую производительность при самых высоких нагрузках. У нас был отдел исследований и разработок с суперспособностями в Python и Go, но ограниченными знаниями Rust для работы над этим сервисом. По результатам эксперимента мы изучили преимущества и недостатки Go и Rust в работе с такими требованиями.

Исследование и сетап

Инструменты, которые уже использовал клиент, были разработаны в основном с использованием Python. Python отлично подходит для работы с аналитикой данных и процессами ETL. Он очень гибкий и простой в использовании, но недостаточно быстрый для обработки нашего сценария использования с высокой нагрузкой. Сначала Python мог обслуживать только около 3000–3500 запросов в секунду на процессор, что было недостаточно для системы.

Вдохновленные похожим кейсом от Kion, мы изучили способы повышения производительности Python. И обнаружили Grain, инструмент, который комбинирует Python с Rust на бэкенде на базе Actix Web. Мы протестировали три реализации: чистый Go с Fiber, Python с Granian и чистый Rust с использованием Actix Web.

Rust против Go: битва производительности

С точки зрения производительности реализация Go оказалась надежной и эффективной. Наша команда, знакомая с характерными практиками Go, настроила HTTP-маршрутизаторы и обработала сериализацию и десериализацию с помощью фреймворка Gin. Простота использования Go позволила реализовать процесс разработки с понятным, читаемым кодом и относительно низкой когнитивной нагрузкой. Однако настоящее испытание началось, когда мы сравнили сырые метрики производительности Go с Rust.

Результаты для Actix Web от Rust были впечатляющими, почти в полтора раза быстрее, чем Go при тех же условиях. Rust производительнее за счет абстракций с нулевой стоимостью и гарантий времени компиляции. В Go сериализация и десериализация основаны на рефлексии в рантайме, что приводит к накладным расходам. В Rust есть библиотека для сериализации и десериализации и генерация кода во время компиляции без необходимости в рефлексии в рантайме. Это дает оптимальное использование CPU и более высокую пропускную способность.

Flame Graphs позволил нам проанализировать ограничения сборки мусора и рефлексии в рантайме для Go. Сборка мусора заняла примерно 10% времени обработки, а процессинг JSON потребовал значительной рефлексии времени выполнения, что замедлило обработку. У Rust такой проблемы не было. Типобезопасность и проверки во время компиляции делают код предсказуемым и эффективным.

Компромисс сложности

Несмотря на впечатляющую производительность Rust, команда столкнулась с проблемами из-за его сложности. Понятный и читаемый код Go облегчает разработчикам понимание и поддержку, а процедурные макросы и дженерики Rust требуют усилий. Процедурные макросы в Rust позволяют генерировать код и проверять синтаксис во время компиляции, что полезно, но требует высокой компетентности. Чем глубже вы погружаетесь в экосистему Rust, тем сложнее она становится.

Опыт нашей команды в написании веб-сервисов на Rust показал, что, хотя язык очень мощный, он требует более высокого уровня знаний. Набор функций Rust может быть полезен разработчикам, уже знакомым с системным программированием, или тем, кто хорошо разбирается в C++ или продвинутом JavaScript. Однако простота и читаемость Go дают значительное преимущество командам, нацеленным на быстрый выход на рынок. Простота привлечения новых разработчиков и предсказуемость кодовой базы Go делают его более доступным и подходящим для быстрых циклов разработки.

Нужны экспертные рекомендации по выбору между Rust или Go для вашего следующего проекта? Команда Evrone имеет опыт работы с обоими языками и поможет вам определить, какой из них лучше всего соответствует вашим конкретным потребностям. Свяжитесь с нами сегодня, чтобы обсудить, как ускорить процесс разработки и достичь наилучших результатов для вашего бизнеса!

Практические примеры и ключевые выводы

Практическое сравнение включало создание HTTP-маршрутизаторов на обоих языках. В Go настройка маршрутизатора с использованием Gin была несложной, с легко читаемыми обработчиками и простым извлечением параметров. С Rust мы использовали Axum, библиотеку, похожую по функциональности на Gin, но с дополнительными преимуществами из-за строгой типизации Rust. Axum позволила напрямую обрабатывать параметры запроса и пути с безопасной типизацией, предотвращая ошибки во время выполнения, и делая код более предсказуемым.

Другим критическим аспектом стала обработка ошибок. Подход Go подразумевает подробные проверки, которые, хотя и просты, могут привести к повторяющемуся шаблону. Rust использует монадические типы, такие как Option и Result, которые обеспечивают отслеживание ошибок через ?-оператор. Функции возвращаются, не прерывая поток, что повышает читаемость и уменьшает беспорядок.

Возможности и прогноз на будущее

Хотя и Go, и Rust обладают уникальными возможностями, расширенные возможности Rust, такие как процедурные макросы, заслуживают особого внимания. Макросы облегчают сложное поведение и помогают исключить повторяющийся код, генерируя его во время компиляции. Их использование требует глубокого понимания AST и TokenStreams, что сложно для новичков.

Сила Go в его минималистичном дизайне. Сборщик мусора и стабильная производительность делают язык подходящим для приложений, где скорость разработки и простота имеют приоритет над эффективностью выполнения. Анонсированные функции Go, такие как управление рабочим пространством для модулей, указывают на постоянные улучшения, что сохранит его актуальность в 2025 году.

Rust позиционирует себя как подходящий инструмент в сценариях, где безопасность памяти и производительность критически важны. Его растущая экосистема и улучшенная эргономика позволили разрабатывать веб-сервисы, которые когда-то считались вотчиной более простых языков, таких как Go.

Выбираем правильный язык

Сравнение Rust и Go в 2025 году показывает, что оба языка нашли свое место в современной разработке программного обеспечения. Rust — убедительный выбор для проектов, где производительность и безопасность типов имеют решающее значение, например, для обработки данных в реальном времени и приложений с малой задержкой. Однако его сложность может снизить производительность для команд, не готовых к его крутой кривой обучения.

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

В Evrone мы понимаем, что у каждого проекта есть уникальные потребности. Независимо от того, нужна ли вам простота и надежность Go или высокая производительность и гарантии безопасности Rust, наша команда обладает опытом, чтобы провести вас через процесс принятия решений и путь разработки. Свяжитесь с нами, чтобы использовать лучшую технологию для ваших целей!

 

Будем на связи
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.