- PVSM.RU - https://www.pvsm.ru -
Привет, %username%
Передо мной была поставлена задача сравнить производительность при сериализации для .NET Core и Golang. Поискав в интернете, наткнулся на репозиторий [1]. Рассматривается простой пример REST микросервиса. Это именно то, что нужно, подумал я. Посмотрев результаты тестирования, я был удивлен. Посмотрев исходный код, я понял, что не так. Вот что мне не понравилось:
Именно эти недочеты стали причиной более подробного рассмотрения производительности в рамках примера, описанного выше. Надеюсь, вам будет интересно узнать результаты.
За основу был взят и исходный код из репозитория выше. Что было доработано:
Доработанный код доступен в репозитории [3].
Для наглядности пример JSON ответа API сервера:
[
{
"Id":"id_8299119732867115081",
"Name":"name_5541535679032008745",
"Time":1566731141
},
...
{
"Id":"id_2804604318195309547",
"Name":"name_5914011395631118540",
"Time":1566731142
}
]
Для оценки производительности в каждом сервисе реализовано три метода:
На основании этих тестов можно оценить относительную производительность веб-серверов (kestrel и net/http), падение производительности при обработке данных с использованием рефлексии и без нее для реализаций на обоих языках.
Тестирование проводилось в несколько этапов для того, чтобы можно было оценить производительность каждого языка и каждой реализации.
Для создания нагрузки была выбрана утилита bombardier [5]. Утилита запускалась со следующими параметрами: -c 125 –d 120s, что можно интерпретировать следующим образом: как использовать 125 потоков со временем тестирования 120 секунд.
Измерение производительности производилось в 3 этапа:
На основании этих измерений, были получены данные о производительности при обработке ответов. Утилизация всех ядер процессора была 99,8-100%. Для оценки были выбраны исходные данные размером 10, 30, 100 и 500 записей. Массивы размером в 500 записей в продакшене встречаются не часто, но мне было интересно посмотреть, как поведет себя каждый из языков.
Все тесты запускались на виртуальной машине, под управлением Ubuntu Server 18.04 со всем обновлениями на август 2019 года. Она имеет следующие характеристики:
Для сравнения производительности были установлены .NET Core 2.2 и Golang 1.12.
Ну, а теперь пора переходить к самому интересному — результатам.
Ниже представлена таблица с результатами тестирования.

Сразу можно заметить, что Golang обладает более производительным веб-сервером. Разница составляет около 12% по сравнению с Kestrel у .NET Core.
На основании данных выше были построена 2 графика. Далее можно наглядно увидеть сравнение RPS.

За счет более быстрой библиотеки net/http Golang показывает не плохие результаты для данных небольшого размера. При увеличении объема данных производительность сравнивается с kestrel.
При использовании рефлексии на небольшом размере данных RPS примерно одинаков с учетом погрешности измерений. С ростом размера данных .NET Core показывает больший RPS.
При тестировании без использования рефлексии оба языка показали прирост производительности. Golang показывает лучшую производительность, так как имеет изначально более высокий RPS(requests per second) на тестах без обработки. На данных небольшого размера преимущество существенное. С ростом размера данных RPS почти сравнивается. На самом большом тесте в 500 записей Golang снова вырывается вперед.

В тестах с использованием рефлексии Golang проиграл по всем фронтам. Падение производительности в худших сценариях составляло более 60%. Реализация сериализации из коробки по производительности вообще никуда не годится.
Без использования рефлексии Golang оказался быстрее во всех тестах. И с ростом данных преимущество Golang только растет. В любом случае, отказ от использования рефлексии дает существенный прирост производительности как для Golang, так и для .NETCore, чего, в общем-то, и следовало ожидать.
Какие можно сделать выводы из этого небольшого сравнения производительности? Хотелось бы сформулировать это в виде плюсов и минусов для каждого из решений. Начнем с Golang:
.NET Core так же имеет ряд преимуществ:
Итог можно подвести такой: если у вас REST API и планируется большая нагрузка, не слишком сложная бизнес логика, лучше использовать Golang, в других случаях можно обойтись и .NET Core. Стоит ли переписывать готовые решения с .NET Core на Golang? Каждый решит для себя сам.
Надеюсь, вам будет полезен данный материал. Всем добра
Автор: Александр
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/331577
Ссылки в тексте:
[1] репозиторий: https://github.com/anjmao/netcore-vs-golang
[2] fasthttp: https://github.com/valyala/fasthttp
[3] репозитории: https://github.com/kurt2012/netcore_vs_golang
[4] easyjson: https://github.com/mailru/easyjson
[5] bombardier: https://github.com/codesenberg/bombardier
[6] Источник: https://habr.com/ru/post/469271/?utm_source=habrahabr&utm_medium=rss&utm_campaign=469271
Нажмите здесь для печати.