Всем привет! Сегодня мы рассмотрим разные фишки и изменения, которые появились в .NET Core платформе и сравним их с Framework. Я разбил статью на модули для более лучшего понимания. Эта статья будет интересна тем кто собирается переходить на .NET Core или уже использует его.

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 платформы. Все перечисленные “плюшки”, которые у нас в компании появились, позволяют сделать среду более открытой и расширяемой. Надеюсь, вы по достоинству оцените. Не бойтесь переходить на новый стек технологий и использовать разные особенности.

Спасибо за внимание. Надеюсь, вам понравилось.