Этот пост является продолжением цикла статей, рассказывающих об эволюции проекта nopCommerce:

8 ноября 2022 года стало важной датой для всех разработчиков .NET, поскольку Microsoft выпустила .NET 7. Это версия STS (standard-term support) с 18-месячной поддержкой. Одно из основных изменений, которое обеспечивает .NET 7, — это более развитая унификация разработки настольного и мобильного программного обеспечения, а также веб, облачных, игровых, IoT и ИИ-решений, чем это было в 6-м релизе.

Наряду с этим Microsoft выпустила Entity Framework Core 7, ASP.NET Core 7, .NET MAUI (интерфейс многоплатформенного приложения), C# 11, F# 7, Windows Presentation Foundation, Windows Forms, Windows Presentation Foundation и Orleans 7.

Повышенная производительность — еще одна замечательная особенность этой версии, которая кратко описана в этой статье. Кроме того, добавлены мнения нескольких экспертов по .NET, чтобы вы могли иметь более разнообразное представление. Также описывается и визуализируется проверка производительности nopCommerce после обновления до .NET 7.

Значимые улучшения в производительности .NET 7

В результате напряженной работы .NET команды Microsoft седьмая версия достигла своих целей, которые были упомянуты при разработке .NET 5. Несмотря на то, что это STS, .NET 7 создает множество возможностей для следующих версий. 

Расписание выпусков .NET: STS и LTS
Расписание выпусков .NET: STS и LTS

Чтобы помочь вам больше узнать о .NET 7 и убедить вас начать использовать эту версию, команда nopCommerce хотела бы описать одно из основных обновлений — производительность. По сути, все улучшения .NET 7 были сделаны для повышения эффективности фреймворка. Однако в .NET 7 есть усовершенствования, напрямую влияющие на производительность.

Вот основные изменения:

1.  Native AOT

Он создает независимую программу без внешних зависимостей в формате файла целевой платформы. Без IL или JIT Native AOT очень легкий, имеет короткое время запуска и автономное развертывание. Native AOT концентрируется на консольных приложениях и требует снижения размера приложений (app trimming) в .NET 7.

2. Замена в стеке (OSR)

Это служит дополнением к многоуровневой компиляции. Замена в стеке позволяет среде выполнения изменить код, выполняемый методом, который в настоящее время используется, пока он все еще находится «в стеке». В процессе выполнения длительные процедуры могут перейти к более эффективным вариантам.

3. Оптимизация по профилю (PGO)

Добавив <TieredPGO>true</TieredPGO> в файл проекта, оптимизацию на основе профиля (PGO) теперь проще включить и она совместима с OSR. Делегаты — это одна из многих вещей, которые PGO может измерить и улучшить.

4. Отражение

Более высокие показатели производительности при использовании отражения связаны со значительной экономией средств при многократном вызове одного и того же элемента объекта. Основываясь на предположения Microsoft, производительность увеличилась в 4 раза.

5. LINQ

И последнее, но не менее важное — это Language-Integrated Query (LINQ). Используя встроенный в язык синтаксис обработки запросов или напрямую используя методы в System.Linq.Enumerable, это средство повышения производительности позволяет простым способом выражать сложные задачи.

Улучшена производительность следующих методов Enumerable: Max, Min, Average и Sum. Это было достигнуто за счет использования обработки векторизации с использованием типа данных Vector<T>. Теперь можно использовать обновленные методы в ситуациях, когда критичны скорость выполнения кода и выделенная память.

Ознакомтесь с постом «Улучшения производительности в .NET 7», чтобы подробно ознакомиться с некоторыми функциями, связанными с производительностью и делающими .NET 7 такой быстрой.

Мысли экспертов .NET о переходе на .NET 7

Помимо оценки производительности платформы nopCommerce, мы опросили нескольких опытных разработчиков .NET. Это может помочь вам понять, стоит ли переход на .NET 7 для ваших проектов. Вот несколько цитат экспертов по .NET:

«.NET 7 фокусируется на повышении производительности, включая усовершенствованный JIT-компилятор, аппаратные встроенные функции и переработанный сборщик мусора. Он также отличается улучшенной поддержкой HTTP/2, встроенным OpenTelemetry для отслеживания запросов и возможностью ускорения сборки в Visual Studio. Удаление зависимостей Docker сокращает время сборки и поддерживает ARM64, что упрощает разработчикам создание высокопроизводительных приложений, которые могут работать на разных устройствах и платформах».

ー Vithal Wadje, эксперт по IoT и облачной платформе Azure, блоггер и Senior инженер-программист в bp.

«Последний выпуск .NET 7 обеспечивает более быстрое время запуска, производительность во время выполнения, скорость работы в сети, оптимизированную производительность WebAssembly и множество новых API-интерфейсов, которые помогают мне создавать невероятно быстрые веб-приложения. На самом деле работать с новой .NET очень весело».

ー Jürgen Gutsch, .NET-блогер и инженер-программист в YOO AG

«В целом, я считаю производительность самым полезным обновлением .NET 7. По сути, оно бесплатное, а производительность никогда не бывает плохой. Кроме того, мне лично нравятся два новых метода в .NET 7: Stream.ReadExactly и Stream.ReadAtLeast. Наиболее заметным улучшением являются улучшения SaveChanges в EF Core 7, если вы используете EF Core».

ー Jiří Činčura, эксперт по .NET, C# и Firebird, блогер и инженер-программист в Microsoft

Улучшения производительности в версии 4.60 nopCommerce

В качестве инструмента тестирования мы решили выбрать достаточно популярный SaaS сервис для тестирования нагрузки и масштабируемости - loader.io. В качестве сервера, на котором развернуто приложение, служит среднестатистическая машина, используемая для разработки:

  • CPU - Intel(R) Core(TM) i5-7400 CPU 3.00 GHz

  • RAM - 16,0 ГБ

Тесты проводились под управлением Windows 10 Pro (версия - 21H2, сборка - 19044.2604) и IIS 10 (10.0.19041.2604). Для теста мы взяли стандартную базу данных, которая поставляется при установке приложения. Все это под управлением MS SQL Server 2019 (19.0.2000).

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

Далее я приведу таблицу соответствия версий приложения nopCommerce версиям платформы .NET.

nopCommerce

4.60

4.50

4.40.4

.NET

.NET 7

.NET 6

.NET 5

Мы провели подряд 3 одинаковых нагрузочных теста, чтобы получить представление не только о характере нагрузки, но и о потреблении памяти на сервере. Усредненные результаты после нескольких прогонов представлены ниже.

Время отклика

Прежде чем представить результаты времени отклика, важно сказать, что чем меньше значение, тем лучше. Наглядно видна тенденция увеличения производительности относительно .NET 5 и .NET 6 версий - на 53.3% и 13.6% соответственно. Это лучшие показатели, которые нам удалось получить в процессе замеров производительности. Хотя и разница между последними двумя версиями невелика, мы все же видим, что работе над производительностью компания Microsoft по прежнему уделяет должное внимание. Каждая новая версия фреймворка становится быстрее предыдущей, это очень приятный бонус, который вы получаете просто перестроив ваш проект под .NET 7 и ничего больше.

Диаграмма
Среднее время отклика .NET 5, .NET 6 и .NET 7

Используемая память

Мы хотели бы представить и обсудить измерение потребления памяти приложением. В этом случае чем меньше задействовано памяти, тем лучше. Тесты проводились последовательно для каждой платформы без сброса пула приложений. Мы привыкли, что плата за увеличение производительности - это неизбежные накладные расходы на ресурсы памяти. Оптимизация в .NET 6 давала некоторую надежду, что аппетит платформы стараются контролировать, но в целом мы понимали, что если быстродействие растет, то и потребление памяти будет увеличиваться. 

Но в этот раз картина изменилась с точностью до наоборот. Ресурсы выделяемые на память сократились относительно предыдущей версии. Результаты вы можете видеть на диаграмме ниже.

Использование памяти .NET 5, .NET 6 и .NET 7
Использование памяти .NET 5, .NET 6 и .NET 7

Распределение нагрузки

А теперь самое интересное, давайте посмотрим более детально как распределялась нагрузка в приложении на платформе.NET 7, и сравним аналогичные данные для тестов на базе .NET 6. Тут нас снова ждет сюрприз.

Распределение нагрузки в .NET 7
Распределение нагрузки в .NET 7
Распределение нагрузки в .NET 6
Распределение нагрузки в .NET 6

Условия теста таковы, что к серверу должно подключиться 250 пользователей за 1 минуту. Из графика видно, за счет того что отклик системы на платформе .NET 7 происходит быстрее (синяя линия), обработка тестовых пользователей в единицу времени носит более линейный характер (зеленая линия). 

Мы больше не наблюдаем всплесков как это было в случае с .NET 6. Это косвенно свидетельствует о том, что серверу на .NET 7 несколько легче справляться с нагрузкой и система уверенно находится в состоянии равновесия. В то время как системе на .NET 6 приходилось увеличивать наплыв пользователей в виду того, что время отклика не просто больше, но и имеет более непостоянный характер. 

Итоги

Новая платформа .NET 7 определенно быстрее своей предшественницы. Немаловажным фактом является и то что, для обеспечения ее работы не нужно выделение бОльших ресурсов, чем это требовалось ранее. В целом же если оценивать целесообразность обновления платформы, то мы считаем что это того стоит. Вы получаете не только возросшую производительность, но множество других полезных нововведений, которые могут быть использованы при разработке проектов любого уровня.

Заключение

Обычно в качестве посредника между двумя основными релизами используются краткосрочные обновления поддержки продукта или фреймворка. Однако для .NET 7 это не совсем так, поскольку в нем есть новые функции и различные обновления. Команда nopCommerce решила оценить улучшения производительности, поскольку они напрямую влияют на нашу платформу электронной коммерции.

Основываясь на повышении производительности после перехода на .NET 7, а также на опыте опытных разработчиков, можно сделать справедливый вывод, что эту версию STS стоит обновить. Кроме того, вы можете найти другие полезные функции, которые могут повысить эффективность разработки и предоставить множество возможностей для масштабирования ваших проектов.

Мы также описывали результаты других обновлений .NET и .NET Core в наших предыдущих статьях: «Улучшения производительности платформы: переход с .NET 5 на .NET 6», «Миграция с .NET Core 2.2 на .NET Core 3.1: nopCommerce опыт» и «Пошаговое руководство по переносу проекта с ASP.NET MVC на ASP.NET Core».

Узнать больше о нашем проекте вы можете на сайте nopcommerce.com или посетив наш репозиторий на GitHub.

Комментарии (1)


  1. Kerman
    11.07.2023 15:33
    +5

    Термин Reflection переводить не надо. "Отражение" смотрится чужеродно.