Всем привет! Сегодня мы рассмотрим разные фишки и изменения, которые появились в .NET Core платформе и сравним их с Framework. Я разбил статью на модули для более лучшего понимания. Эта статья будет интересна тем кто собирается переходить на .NET Core или уже использует его.
В данный момент у нас есть три платформы: .NET Framework, Mono и .NET Core. Каждая платформа включает в себя следующие технологии:
NET Framework — WPF, WinForms, ASP.NET (DNX реализация), WCF
NET Core — UWP, ASP.NET Core, WA, Xamarin (.NET Standard), Avalonia and other
Mono — Xamarin (PCL, Share project), Unity, ASP.NET, WinForms (cross platform)
NET Core (3.0) — Всё тоже самое, что и у .NET Core выше + WPF и WinForms, ML.NET
Ещё есть .NET Standard. Это набор классов, методов и интерфейсов, которые позволяют писать и использовать общий код под все перечисленные выше платформы. Ещё на ней можно писать консольные приложения. Вкратце это тот же PCL, но работает на всех перечисленных выше платформах.
Н�� буду заострять на этом ваше внимание, просто перечислю поддержку ОС для NET Core проектов:
• Windows
• Linux
• MacOS
Дополнительно поддерживает запуск под ARM процессоры на Linux и Windows.
В рамках кросс-совместимости платформа для разработки приложений включает в себя модульную инфраструктуру. Она выдается через NuGet, и вы можете получить доступ к пакетным функциям, а не к одной большой сборке. Как разработчик вы можете создавать легкие приложения, содержащие только необходимые пакеты NuGet, что сделает вашу программу безопаснее и производительнее.
Модульная инфраструктура также позволяет быстрее обновлять платформу .NET Core, поскольку затронутые модули могут обновляться и выпускаться по отдельности.
Теперь давайте углубимся и посмотрим более подробно, что у нас под капотом в проектах. При создании нового проекта каждый из вас сталкивался с файлом MyProject1.csproj (название может отличаться). Этот файл отвечает за настройки компиляции данного проекта, зависимостей других проектов или либ (библиотек) и много чего ещё.
У меня для вас есть пример того, как я решил переписать один проект на .NET Standard. Давайте взглянем, как было до (Framework):

К сожалению на моём ПК этот файл не влезает полностью (там остались ещё референсы). А теперь взглянем как стало после переноса:

В NET Core и .NET Standard csproj был сильно упрощен. Особо «шаристые» могут заметить, что немного изменились либы. Я убрал ненужное и заменил на более удобные инструменты. После переписывания csproj я заметил, что работа с NuGet пакетами стали занимать заметно меньше времени и как вы понимаете править новую версию csproj в разы удобнее, ибо он не загроможден лишними строками.
• Измененный Random
• Измененный HttpClient
• Оптимизированы циклы
• Оптимизированы List, Array
• Оптимизированы Stream, MemoryStream
• И многое другое
В данной статье я не буду рассматривать все изменения. Это будет отдельной статьей. Но давайте рассмотрим небольшой пример на коллекции List:
Я прогнал его через benchmarkdotnet.org на обеих платформах. После тестов у меня вышли следующие результаты:
Core 2.2.4 x64 RyuJIT
Method: BenchmarkList
Mean: 370.1 ms
Error: 0.3761 ms
StdDev: 0.3518 ms
Framework 4.7.2 x64 RyuJIT
Method: BenchmarkList
Mean: 481.9 ms
Error: 1.210 ms
StdDev: 1.011 ms
Как видите, скорость работы существенно отличается(в разы) в пользу Core.
Microsoft старается не только дать разработчикам удобные инструменты для разработки, но и улучшает базовые вещи, которые приводят к улучшениям и оптимизациям ваших проектов.
Это возможность, благодаря которой среда выполнения более адаптивно использует компилятор JIT для повышения производительности при запуске и максимального увеличения пропускной способности.
Компилирует проект так быстро, насколько это возможно.
Оптимизирует наиболее частые методы.
Данный функционал приводит к тому, что ваш проект быстрее собирается и даёт вам почти аналогичную производительность. Мы тестировали данный функционал, и это шикарная функция для NET Core проектов, которая уменьшает время компиляции. Многоуровневая компиляция незначительно замедляет работу вашего приложения, я не советую включать ее на production сервере, но для отладки более чем актуальная функция которая экономит время программистов.
Компания Microsoft старается улучшить жизнь разработчикам .NET платформы. Все перечисленные “плюшки”, которые у нас в компании появились, позволяют сделать среду более открытой и расширяемой. Надеюсь, вы по достоинству оцените. Не бойтесь переходить на новый стек технологий и использовать разные особенности.
Спасибо за внимание. Надеюсь, вам понравилось.
Stack technology
В данный момент у нас есть три платформы: .NET Framework, Mono и .NET Core. Каждая платформа включает в себя следующие технологии:
NET Framework — WPF, WinForms, ASP.NET (DNX реализация), WCF
NET Core — UWP, ASP.NET Core, WA, Xamarin (.NET Standard), Avalonia and other
Mono — Xamarin (PCL, Share project), Unity, ASP.NET, WinForms (cross platform)
NET Core (3.0) — Всё тоже самое, что и у .NET Core выше + WPF и WinForms, ML.NET
NET Standard
Ещё есть .NET Standard. Это набор классов, методов и интерфейсов, которые позволяют писать и использовать общий код под все перечисленные выше платформы. Ещё на ней можно писать консольные приложения. Вкратце это тот же PCL, но работает на всех перечисленных выше платформах.
Cross Platform
Н�� буду заострять на этом ваше внимание, просто перечислю поддержку ОС для NET Core проектов:
• Windows
• Linux
• MacOS
Дополнительно поддерживает запуск под ARM процессоры на Linux и Windows.
Dependency
В рамках кросс-совместимости платформа для разработки приложений включает в себя модульную инфраструктуру. Она выдается через NuGet, и вы можете получить доступ к пакетным функциям, а не к одной большой сборке. Как разработчик вы можете создавать легкие приложения, содержащие только необходимые пакеты NuGet, что сделает вашу программу безопаснее и производительнее.
Модульная инфраструктура также позволяет быстрее обновлять платформу .NET Core, поскольку затронутые модули могут обновляться и выпускаться по отдельности.
CSPROJ
Теперь давайте углубимся и посмотрим более подробно, что у нас под капотом в проектах. При создании нового проекта каждый из вас сталкивался с файлом MyProject1.csproj (название может отличаться). Этот файл отвечает за настройки компиляции данного проекта, зависимостей других проектов или либ (библиотек) и много чего ещё.
У меня для вас есть пример того, как я решил переписать один проект на .NET Standard. Давайте взглянем, как было до (Framework):

К сожалению на моём ПК этот файл не влезает полностью (там остались ещё референсы). А теперь взглянем как стало после переноса:

В NET Core и .NET Standard csproj был сильно упрощен. Особо «шаристые» могут заметить, что немного изменились либы. Я убрал ненужное и заменил на более удобные инструменты. После переписывания csproj я заметил, что работа с NuGet пакетами стали занимать заметно меньше времени и как вы понимаете править новую версию csproj в разы удобнее, ибо он не загроможден лишними строками.
Performance & Improvements
• Измененный Random
• Измененный HttpClient
• Оптимизированы циклы
• Оптимизированы List, Array
• Оптимизированы Stream, MemoryStream
• И многое другое
В данной статье я не буду рассматривать все изменения. Это будет отдельной статьей. Но давайте рассмотрим небольшой пример на коллекции List:
var list = new List<int>();
for (int i = 0; i < 100000000; i++)
{
list.Add(i);
list.RemoveAt(0);
}Я прогнал его через benchmarkdotnet.org на обеих платформах. После тестов у меня вышли следующие результаты:
Core 2.2.4 x64 RyuJIT
Method: BenchmarkList
Mean: 370.1 ms
Error: 0.3761 ms
StdDev: 0.3518 ms
Framework 4.7.2 x64 RyuJIT
Method: BenchmarkList
Mean: 481.9 ms
Error: 1.210 ms
StdDev: 1.011 ms
Как видите, скорость работы существенно отличается(в разы) в пользу Core.
Microsoft старается не только дать разработчикам удобные инструменты для разработки, но и улучшает базовые вещи, которые приводят к улучшениям и оптимизациям ваших проектов.
Tier Compilation
Это возможность, благодаря которой среда выполнения более адаптивно использует компилятор JIT для повышения производительности при запуске и максимального увеличения пропускной способности.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<LangVersion>7.3</LangVersion>
<!--Следующая строка отвечает за включение данной функции-->
<TieredCompilation>true</TieredCompilation>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
</Project>Компилирует проект так быстро, насколько это возможно.
Оптимизирует наиболее частые методы.
Данный функционал приводит к тому, что ваш проект быстрее собирается и даёт вам почти аналогичную производительность. Мы тестировали данный функционал, и это шикарная функция для NET Core проектов, которая уменьшает время компиляции. Многоуровневая компиляция незначительно замедляет работу вашего приложения, я не советую включать ее на production сервере, но для отладки более чем актуальная функция которая экономит время программистов.
Заключение
Компания Microsoft старается улучшить жизнь разработчикам .NET платформы. Все перечисленные “плюшки”, которые у нас в компании появились, позволяют сделать среду более открытой и расширяемой. Надеюсь, вы по достоинству оцените. Не бойтесь переходить на новый стек технологий и использовать разные особенности.
Спасибо за внимание. Надеюсь, вам понравилось.