9 мая 2019

.NET зоопарк под призмой NET Core

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

Спасибо за внимание. Надеюсь, вам понравилось.
Теги:.net.net corec#compilationnuget
Хабы: .NET C# Разработка под Linux Xamarin Разработка под Windows
+16
12,1k 43
Комментарии 27
Лучшие публикации за сутки