Чому варто перейти на .NET 9? Що нового?

pic

Як відомо, .NET 9 був випущений минулого місяця. Ми вирішили оновити наші проекти, як тільки з’явилася можливість. Але чому? Однією з найважливіших тем сьогодні є витрати. Для того, щоб знизити вартість програми, потрібно зосередитися на оптимізації коду, продуктивності та зниженому споживанні ресурсів. .NET 9 якраз відкриває нові можливості для розробників. У цьому матеріалі ми розглянемо переваги, які приносить .NET 9. Почнемо!

Якщо ми оцінюватимемо нововведення та переваги за важливістю, то от що ми отримуємо:

  1. Продуктивність: Покращення продуктивності в .NET 9, зокрема в роботі з колекціями, циклами та запитами LINQ, створюють помітну різницю. Швидші операції запитів, оптимізоване використання пам’яті та покращене середовище виконання призвели до значних змін як на етапі розробки, так і в процесі роботи наших проєктів.
    2.
    Серіалізація (Serialization): Операції, такі як серіалізація JSON, стали швидшими та безпечнішими з .NET 9. Ця можливість була особливо корисною в наших проєктах, де ми працюємо з великими наборами даних.
  2. Рефлексія (Reflection): Завдяки новим можливостям рефлексії в .NET 9, ми змогли писати більш зрозумілий, компактний і модульний код.
    Це також полегшило командну роботу та процеси перегляду коду.

Тепер давайте поглянемо на різницю між цією версією та попередньою на графіках і даних. Для детальніших аналізів ви зможете знайти посилання в розділі джерел.

pic

Порівняння серіалізації та десеріалізації (Serialize and Deserialize)

pic

Результати бенчмарків Loops

pic

Покращення продуктивності LINQ

Як ми бачили в офіційних документаціях і статтях, одна з важливих змін — це поліпшення Garbage Collector (GC), який став більш адаптивним. У середовищах з високою кількістю ядер це покращує управління пам'яттю. Ці зміни, особливо в хмарних застосунках, оптимізують використання пам'яті, не впливаючи на швидкість обробки.
Як показує результат у бенчмарку TechEmpower, .NET 9 досяг значних успіхів, зменшивши використання пам'яті та підвищивши швидкість обробки.

pic

.NET 9 Minimal API Performance

Ось мої улюблені нові можливості:

З .NET 9 клас JsonSerializerOptions надає більше гнучкості у форматуванні виводу JSON. Тепер ми можемо налаштувати символи відступу та їх розмір, що дозволяє контролювати читабельність і структуру створених даних JSON. Крім того, стало набагато легше застосовувати стандартну для веб-додатків практику використання правил найменування в стилі “camelCase”. Завдяки сінглтону “JsonSerializerOptions.Web” ми тепер можемо за замовчуванням використовувати політику найменування “camelCase” для серіалізації, що відповідає веб-стандартам.
Ці нововведення роблять процес серіалізації JSON в .NET 9 більш налаштовуваним та сумісним з веб-стандартами.

Для більш детального пояснення:

Налаштування символу відступу та його розміру: Раніше, під час серіалізації даних JSON, за замовчуванням використовувався символ пробілу і відступ розміром 2 одиниці. З .NET 9, завдяки новим властивостям IndentCharacter та IndentSize, доданим до класу JsonSerializerOptions, тепер можна визначити бажаний символ відступу (наприклад, символ табуляції \t) та розмір відступу.
Це особливо корисна функція, коли потрібно обмінюватися даними між різними системами або коли необхідна висока читабельність.

using System.Text.Json;  
using Net9Examples;  
namespace Net9Examples  
{  
 record Products(string Name, string Description, decimal Price, int Quantity, string Category);  
}  
List productList =  
[  
 new("Product 1", "Description 1", 10.99m, 5, "Category 1"),  
 new("Product 2", "Description 2", 19.99m, 3, "Category 2"),  
 new("Product 3", "Description 3", 7.99m, 8, "Category 3")  
];  
var options = new JsonSerializerOptions  
{  
 WriteIndented = true,  
 IndentCharacter = '\t',  
 IndentSize = 1  
};  
string json = JsonSerializer.Serialize(productList, options);  
Console.WriteLine(json);

Результат буде виглядати так:

[  
 {  
 "Name": "Product 1",  
 "Description": "Description 1",  
 "Price": 10.99,  
 "Quantity": 5,  
 "Category": "Category 1"  
 },  
 {  
 "Name": "Product 2",  
 "Description": "Description 2",  
 "Price": 19.99,  
 "Quantity": 3,  
 "Category": "Category 2"  
 },  
 {  
 "Name": "Product 3",  
 "Description": "Description 3",  
 "Price": 7.99,  
 "Quantity": 8,  
 "Category": "Category 3"  
 }  
]

Серіалізація, сумісна з веб-стандартами за допомогою JsonSerializerOptions.Web: Для зручності я додав префікс "Product" перед кожною властивістю.

using System.Text.Json;  
using Net9Examples;  
namespace Net9Examples  
{  
 record Products(string ProductName, string ProductDescription, decimal ProductPrice, int ProductQuantity, string ProductCategory);  
}  
List productList =  
[  
 new("Product 1", "Description 1", 10.99m, 5, "Category 1"),  
 new("Product 2", "Description 2", 19.99m, 3, "Category 2"),  
 new("Product 3", "Description 3", 7.99m, 8, "Category 3")  
];  
string json = JsonSerializer.Serialize(productList, JsonSerializerOptions.Web);  
Console.WriteLine(json);

Результат буде виглядати так:

[{"productName":"Product 1","productDescription":"Description 1","productPrice":10.99,"productQuantity":5,"productCategory":"Category 1"},{"productName":"Product 2","productDescription":"Description 2","productPrice":19.99,"productQuantity":3,"productCategory":"Category 2"},{"productName":"Product 3","productDescription":"Description 3","productPrice":7.99,"productQuantity":8,"productCategory":"Category 3"}]

З .NET 9 додано нові методи CountBy та AggregateBy для LINQ, які значно спрощують операції групування та підсумовування в колекціях.
Ці методи значно покращують читаність коду, особливо в сценаріях аналізу та обробки даних, пришвидшуючи процес розробки. До .NET 9 для цих операцій використовувались комбінації методів GroupBy, Aggregate та Count, що призводило до складного та важкого для розуміння коду.

Метод CountBy:

Метод CountBy групує елементи колекції за певним ключем і повертає кількість елементів у кожній групі.
Це дуже корисно для підрахунку, скільки разів кожне унікальне значення з'являється в колекції.

string[] fruits = { "apple", "pear", "apple", "banana", "strawberry", "pear", "apple" };  
var fruitCounts = fruits.CountBy(fruit => fruit);  
foreach (var fruitCount in fruitCounts)  
{  
 Console.WriteLine($"{fruitCount.Key}: {fruitCount.Value}");  
}

Наш результат виглядатиме наступним чином:

apple: 3  
pear: 2  
banana: 1  
strawberry: 1

В іншому прикладі ми можемо використати цей метод для знаходження повторів слів у реченні.

using System.Text.RegularExpressions;  
string sentence = "This is a sample sentence. This sentence is a sample. Is this a sample sentence?";  
var wordCounts = Regex.Split(sentence, @"\W+")   
 .Where(word => !string.IsNullOrEmpty(word))   
 .Select(word => word.ToLower())  
 .CountBy(word => word);   
foreach (var wordCount in wordCounts)  
{  
 Console.WriteLine($"{wordCount.Key}: {wordCount.Value}");  
}

Наш результат буде таким:

this: 3  
is: 2  
a: 3  
sample: 3  
sentence: 3  
is: 1

Метод AggregateBy

Метод AggregateBy групує елементи колекції за певним ключем і виконує агрегатну операцію для кожної групи.
Це ідеальний метод для виконання обчислень, таких як середнє значення, сума, максимальні/мінімальні значення, на згрупованих даних.

var products = new[]  
{  
 new { Name = "Apple", Price = 10 },  
 new { Name = "Pear", Price = 15 },  
 new { Name = "Apple", Price = 12 },  
 new { Name = "Banana", Price = 20 },  
 new { Name = "Pear", Price = 18 }  
};  
var productTotalPrices = products.AggregateBy(  
 keySelector:  
 product => product.Name,   
 seed: 0m,  
 (total, product) => total + product.Price  
);  
foreach (var productTotalPrice in productTotalPrices)  
{  
 Console.WriteLine($"{productTotalPrice.Key}: {productTotalPrice.Value}");  
}

Результат буде таким:

Apple: 22  
Pear: 33  
Banana: 20

Після того, як ми розглянули приклади, що допомагають краще зрозуміти тему, ця стаття підходить до завершення.
Дякуємо за прочитане, до зустрічі в наступній статті!

Ресурси:

[

Покращення продуктивності в .NET 9 - Блог .NET

Ознайомтесь з глибоким оглядом сотень покращень продуктивності в .NET 9.

devblogs.microsoft.com

](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-9/?source=post_page-----d149c05069e2--------------------------------)

https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/

Перекладено з: Neden .NET 9'a Geçmeliyiz? Neler Yeni?

Leave a Reply

Your email address will not be published. Required fields are marked *