- PVSM.RU - https://www.pvsm.ru -

Вышел .NET 5. И что?

Несколько недель назад вышел .NET 5. На сайте Microsoft можно найти подробный анонс [1] со всеми изменениями, но главный вопрос для меня, как для разработчика — и что с того? Что мне с выхода пятого дотнета, как я могу его использовать, есть ли смысл переходить на новую версию прямо сейчас? На эти вопросы я постараюсь ответить дальше.

image

Перфоманс

Изменения в перфомансе — это самая заметная часть релиза. О них много писали на сайте Microsoft [2] и рассказывали на .NET Conf [3]. Давайте посмотрим внимательнее и определимся, где, насколько и за счет чего выросла производительность.

image

Измерения перфоманса с этого скрина основаны на бенчмарках от TechEmpower. Здесь Microsoft сравнивают результаты замеров производительности .NET 3.1 с ожидаемыми значениями для .NET 5. Стоит заметить, что это именно ожидаемые значения — реальных результатов от TechEmpower пока не было. Однако уже эти результаты выглядят впечатляюще — ускорение на 38 процентов для Plaintext, на 42 для Json и на 20 процентов в категории Fortunes (пояснения по разным типам бенчмарков вы можете найти в вики TechEmpower [4]).

Помимо результатов бенчмарков от TechEmpower, Microsoft также рассказывает и о других улучшениях. Например, сериализация JSON стала работать на 20% быстрее, а сериализация больших коллекций и массивов ускорилась аж в три раза.

Также замеры производительности делал автор библиотеки Fusion [5] Александр Якунин. В двух статьях на Medium он сначала измерил, насколько ускорилась работа демок [6] его библиотеки (от 20 до 105 процентов), а затем проверил пятый .NET на нескольких синтетических бенчмарках [7]— и также получил некоторое ускорение.

За счет чего это происходит? В первую очередь, благодаря изменениям в GC, которые привели к уменьшению количества аллокаций и ускорению сборки мусора. Кстати, все эти изменения осуществляются одновременно с переписыванием GC на C#, а значит его код становится куда доступнее, понятнее и безопаснее. Подробности можно почитать в статье от Microsoft [8].

Другие изменения коснулись JIT компиляции, асинхронности и многих методов базовой библиотеки. Это касается методов, относящихся к работе со строками, регулярными выражениями и, что особенно важно, с коллекциями и сериализацией. Во все той же статье [9] приводится много примеров таких изменений, с соответствующими пулл-реквестами и бенчмарками.

Изменения в JSON сериализации выглядят особенно впечатляюще. Только посмотрите на результаты бенчмарка по сериализации больших массивов!

private MemoryStream _stream = new MemoryStream();
private DateTime[] _array = Enumerable.Range(0, 1000).Select(_ => DateTime.UtcNow).ToArray();

[Benchmark]
public Task LargeArray()
{
    _stream.Position = 0;
    return JsonSerializer.SerializeAsync(_stream, _array);
}

image

Коротко — пятый дотнет сильно вырос в производительности и это важнейшая часть нового релиза. Большинство стандартных веб-приложений могут ожидать прирост производительности на 20% и выше, а отдельные приложения могут и вовсе ускориться в несколько раз.

Языковое

Вместе с .NET 5 вышла и девятая версия C#. Официальную страничку с изменениями вы можете найти на сайте Microsoft [10], но давайте попробуем разобраться — что именно здесь стоит внимания?

Самое заметное изменение — это record-типы, позволяющие избавиться от бойлерплейта при написании DTO. Записи — это иммутабельные ссылочные типы с простым и коротким объявлением. В них по умолчанию определены методы Equals, HashCode, Copy, Clone, PrintMembers и ToString — разумеется, все они используют значения полей типа для выполнения операций. То есть Equals корректно сравнивает две записи по значениям, а не по ссылке.

Также записи поддерживают синтаксис копирования с изменением значений полей через with, например:

var person = new Person { FirstName = "Mads", LastName = "Nielsen" };
var otherPerson = person with { LastName = "Torgersen" };

Больше о применении записей вы можете почитать в блоге Владимира Хорикова [11] и в публикации от Konrad Kokosa [12].

Другое важное изменение — это обновленный pattern matching. Теперь паттерны могут настраиваться по типам и операторам сравнения, причем несколько разных сравнений вы можете объединять через логические операторы. Например:

DeliveryTruck t when t.GrossWeightClass switch 
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m
}

Остальные изменения не столь заметны — они касаются верхнеуровневых программ (возможность писать короткие программы без базового класса и функции main), упрощенного синтаксиса для new (без указания типа), init-only сеттеров и прочего.

Последние изменения в новом C#, которые хотелось бы упомянуть — это расширенная поддержка для source generators [13]. Этот функционал позволяет генерировать код при компиляции проекта и зачастую очень удобен для авторов библиотек. В новом релизе работу с генераторами кода сделали чуть проще, расширив функционал partial классов (с них сняли некоторые из старых ограничений) и добавив инициализаторы модулей (методы, которые вызываются до первого доступа к любому полю/методу модуля).
Хороший пример работы с генераторами кода вы можете найти в этой статье на Medium [14].

Отдельно стоит рассказать про F# 5. В новой версии языка добавилась масса классных возможностей для скриптов (например, директива для подключения nuget пакетов), slicing для более удобной работы с данными, а также улучшилась работа с quotation expressions и computation expressions. А еще сильно улучшился интероп с C# и перфоманс. Словом, новый релиз выглядит интересно и делает F# потенциально полезнее в продакшене. Полное описание всех изменений можно найти на сайте Microsoft [15].

Коротко — язык оброс разнообразным сахаром. Самое заметное изменение в C# 9 — это записи, но едва ли оно само по себе стоит обновления. С другой стороны, если вы будете обновлять версию дотнета по каким-то другим причинам, то у вас появится новый функционал, делающий язык чуть более мощным. Мелочь, а приятно.

Прочее

Помимо глобальных улучшений платформы Microsoft также неплохо поработали над отдельными библиотеками.

Например, в новой версии дотнета сильно улучшилась поддержка десктопа. WinForms и WPF наконец-то получили все преимущества .NET Core — классный перфоманс, упаковка всего приложения в один .exe, работа без установленного на машине дотнета и… и нет, не кроссплатформенность. Все это работает только под Windows.

Помимо прочего, для десктопной разработки под Windows также добавили нормальный визуальный дизайнер, тулинг, новые контролы и улучшенную поддержку для старых. Словом — если вы разрабатываете приложения с использованием WinForms или WPF, ваша жизнь станет лучше.

С кроссплатформенностью все осталось по-прежнему. Релиз MAUI перенесли на .NET 6, а других решений для кроссплатформенного десктопа Microsoft пока не предлагает. Так что продолжаем использользовать Авалонию [16] (или можно обратить свое внимание на Uno Platform [17] — перспективно выглядящий фреймворк для разработки на все и сразу).

Еще больше улучшений появилось для фулстек веб-разработки с использованием Blazor. Главное из них это улучшения производительности — Microsoft обещают, что WebAssembly версия Blazor ускорится аж в три раза. Одной из основных причин такого роста производительности стал пререндер на стороне сервера. А еще добавили ленивую подгрузку зависимостей, изоляцию CSS/JS в рамках файла, новые контролы и многое другое. В общем, если вы собирались попробовать Blazor, но все никак не доходили руки — сейчас он выглядит куда более production-ready технологией.

image

Из оставшихся изменений заметнее всего смотрятся те, которые призваны помочь микросервисам и работе с облачными сервисами в целом. Здесь и уменьшение размеров Docker-контейнеров [18], и улучшенная поддержка gRPC, и поддержка OpenAPI по умолчанию [19], и многое другое. Кстати, Azure полностью поддерживает .NET 5 со дня релиза.

А еще Microsoft выкатили Project Tye [20], который как раз является инструментом для удобного управления микросервисами. На текущий момент трудно сказать, стоит ли использовать Tye в продакшене, но обратить внимание и поиграться с ним в свободное время определенно нужно.

Коротко — Microsoft улучшили поддержку отдельных инструментов и добавили приятных фич для облака. Если вы используете WinForms, WPF или Blazor — обновиться определенно стоит.

Миграция

Давайте разберемся, насколько сложно будет мигрировать ваше приложение с .NET Core 3 на .NET 5?

Гайд по миграции от Microsoft [21] говорит нам, что основные сложности в миграции коснутся приложений на Blazor, там произошло много ломающих изменений. Для большинства же остальных приложений понадобится просто обновить версию дотнета в application.json, файл проекта и версии зависимостей. А еще адрес докер-контейнера с .NET 5 немного отличается от соответствующего адреса для .NET 3.1:

docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
docker pull mcr.microsoft.com/dotnet/aspnet:5.0

Другие отзывы о миграции, которые я смог найти — например, вот этот гайд [22] от Alexandre Malavasi и твит о миграции Fusion [23] от Александра Якунина — тоже говорят, что миграция проходит без каких-то специфических трудностей. Я также не столкнулся с особыми проблемами, пока мигрировал свои проекты и демки на новый дотнет. В любом случае, перед миграцией на новую версию советую внимательно изучить список ломающих изменений [24]. А еще стоит посмотреть доклад про миграцию [25] с .NET Conf.

Итого

Подведем итоги. Стоит ли мигрировать на новый дотнет и ради чего?

Кажется, самое важное, ради чего стоит заморачиваться — это перфоманс. Ускорили практически все и достаточно заметно. Как на низком уровне — через улучшения в GC и JIT — так и на уровне отдельных частей фреймворка. Так что, если вы хотите выиграть в производительности, стоит как минимум попробовать обновить версию фреймворка и замерить, насколько ускорились основные сценарии.

Другие важные причины для миграции — это улучшения для Blazor и WPF/WinForms. Если вы используете любой из этих фреймворков, стоит попробовать перейти на .NET 5, все же изменения достаточно заметные и полезные. Однако стоит учитывать, что для Blazor миграция выйдет достаточно непростой.

C# 9 определенно не является серьезным мотивом для переезда на новый дотнет, но принесет с собой приятных обновлений синтаксиса за компанию‎. В то же время и рекорды, и паттерн матчинг добавляют много возможностей сделать код более запутанным — советую обсудить это в команде и решить, как лучше использовать (или не использовать) их в проекте.

И на этом все! Удачной миграции на новый дотнет. Оставайтесь на связи, мы вернемся с более подробными материалами про современные возможности дотнета.

Автор: Роман Неволин

Источник [26]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/359426

Ссылки в тексте:

[1] подробный анонс: https://devblogs.microsoft.com/dotnet/announcing-net-5-0/

[2] на сайте Microsoft: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/

[3] на .NET Conf: https://youtu.be/o-esVzL3YLI?t=490

[4] вики TechEmpower: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview

[5] Fusion: https://github.com/servicetitan/Stl.Fusion/

[6] насколько ускорилась работа демок: https://alexyakunin.medium.com/astonishing-performance-of-net-5-7803d69dae2e

[7] на нескольких синтетических бенчмарках : https://medium.com/swlh/astonishing-performance-of-net-5-more-data-5cdc8d821e8c

[8] статье от Microsoft: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/#gc

[9] все той же статье: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/#collections

[10] на сайте Microsoft: https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-9

[11] блоге Владимира Хорикова: https://enterprisecraftsmanship.com/posts/csharp-records-value-objects/

[12] публикации от Konrad Kokosa: https://tooslowexception.com/6-less-popular-facts-about-c-9-records/

[13] source generators: https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

[14] в этой статье на Medium: https://medium.com/rocket-mortgage-technology-blog/generating-code-in-c-1868ebbe52c5

[15] на сайте Microsoft: https://devblogs.microsoft.com/dotnet/announcing-f-5/

[16] Авалонию: https://avaloniaui.net/

[17] Uno Platform: https://platform.uno/

[18] уменьшение размеров Docker-контейнеров: https://github.com/dotnet/dotnet-docker/issues/1814#issuecomment-625294750

[19] поддержка OpenAPI по умолчанию: https://docs.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-5.0?view=aspnetcore-5.0#web-api

[20] Project Tye: https://devblogs.microsoft.com/aspnet/introducing-project-tye/

[21] Гайд по миграции от Microsoft: https://docs.microsoft.com/ru-ru/aspnet/core/migration/31-to-50

[22] вот этот гайд: https://medium.com/swlh/migration-from-asp-net-core-3-1-to-5-0-real-project-69b1ff68328

[23] твит о миграции Fusion: https://twitter.com/alexyakunin/status/1326438626901729280

[24] список ломающих изменений: https://docs.microsoft.com/en-us/dotnet/core/compatibility/5.0

[25] доклад про миграцию: https://www.youtube.com/watch?v=bvmd2F11jpA

[26] Источник: https://habr.com/ru/post/531190/?utm_source=habrahabr&utm_medium=rss&utm_campaign=531190