Як відомо, .NET 9 був випущений минулого місяця. Ми вирішили оновити наші проекти, як тільки з’явилася можливість. Але чому? Однією з найважливіших тем сьогодні є витрати. Для того, щоб знизити вартість програми, потрібно зосередитися на оптимізації коду, продуктивності та зниженому споживанні ресурсів. .NET 9 якраз відкриває нові можливості для розробників. У цьому матеріалі ми розглянемо переваги, які приносить .NET 9. Почнемо!
Якщо ми оцінюватимемо нововведення та переваги за важливістю, то от що ми отримуємо:
- Продуктивність: Покращення продуктивності в .NET 9, зокрема в роботі з колекціями, циклами та запитами LINQ, створюють помітну різницю. Швидші операції запитів, оптимізоване використання пам’яті та покращене середовище виконання призвели до значних змін як на етапі розробки, так і в процесі роботи наших проєктів.
2.
Серіалізація (Serialization): Операції, такі як серіалізація JSON, стали швидшими та безпечнішими з .NET 9. Ця можливість була особливо корисною в наших проєктах, де ми працюємо з великими наборами даних. - Рефлексія (Reflection): Завдяки новим можливостям рефлексії в .NET 9, ми змогли писати більш зрозумілий, компактний і модульний код.
Це також полегшило командну роботу та процеси перегляду коду.
Тепер давайте поглянемо на різницю між цією версією та попередньою на графіках і даних. Для детальніших аналізів ви зможете знайти посилання в розділі джерел.
Порівняння серіалізації та десеріалізації (Serialize and Deserialize)
Результати бенчмарків Loops
Покращення продуктивності LINQ
Як ми бачили в офіційних документаціях і статтях, одна з важливих змін — це поліпшення Garbage Collector (GC), який став більш адаптивним. У середовищах з високою кількістю ядер це покращує управління пам'яттю. Ці зміни, особливо в хмарних застосунках, оптимізують використання пам'яті, не впливаючи на швидкість обробки.
Як показує результат у бенчмарку TechEmpower, .NET 9 досяг значних успіхів, зменшивши використання пам'яті та підвищивши швидкість обробки.
.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?