30-дневное испытание .NET. День 22. Использование пула массивов
11 апреля 2024 г.ArrayPool
Введение
Частое выделение и освобождение больших буферов может повлиять на производительность из-за увеличения нагрузки на сборщик мусора. Нам рекомендуется ArrayPool
Цели обучения
- Понимание проблемы традиционного распределения буфера
- Подход с использованием ArrayPool
- Рекомендации по использованию ArrayPool
Необходимые требования для разработчиков
- Базовое понимание языка программирования C#.
Начало работы
Понимание проблемы традиционного распределения буфера
Общий подход, используемый разработчиками, предполагает прямое выделение нового буфера.
// Allocating a new large buffer
byte[] buffer = new byte[4096];
Хотя вышеупомянутый фрагмент кода выглядит чистым и понятным, он имеет существенные недостатки в отношении производительности, особенно в приложениях, которые часто запрашивают большие временные буферы. Каждое выделение увеличивает размер кучи, что приводит к более частой сборке мусора.
Подход с использованием ArrayPool
ArrayPool
// Using ArrayPool<T> to recycle large buffers
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(4096);
try
{
// Work with the buffer
}
finally
{
pool.Return(buffer);
}
Рекомендации по использованию ArrayPool
Хотя ArrayPool
- Правильно возвращайте буферы. Всегда возвращайте арендованные буферы в пул в блокеfinally, чтобы гарантировать их возврат даже в случае возникновения исключения.
- Очищать буферы при необходимости. Если в буфере хранятся конфиденциальные данные, используйте перегрузку метода Return, которая принимает логический параметр, указывающий, следует ли очищать буфер.
- Избегайте хранения буферов в течение длительного времени. Арендуйте буферы на кратчайший срок, необходимый для поддержания эффективности пула и предотвращения его истощения.
Полный код
Создайте еще один класс с именем ArrayPoolExample и добавьте следующий фрагмент кода
public static class ArrayPoolExample
{
public static void BadMethod()
{
// Allocating a new large buffer
byte[] buffer = new byte[4096];
// Simulate work with the buffer
FillBuffer(buffer, 0xAA); // Example operation
Console.WriteLine("Buffer used and will be discarded after method execution.");
}
public static void GoodMethod()
{
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(4096);
try
{
// Work with the buffer
FillBuffer(buffer, 0xBB); // Example operation
Console.WriteLine("Buffer rented from the pool and returned after use.");
}
finally
{
pool.Return(buffer);
}
}
public static void FillBuffer(byte[] buffer, byte value)
{
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = value;
}
// Just an example to simulate buffer usage
Console.WriteLine($"Buffer filled with value: {value}");
}
}
Выполнить из основного метода следующим образом
#region Day 22: Array Pool
static string ExecuteDay22()
{
Console.WriteLine("Demonstrating BAD Method:");
ArrayPoolExample.BadMethod();
Console.WriteLine("nDemonstrating GOOD Method:");
ArrayPoolExample.GoodMethod();
return "Executed Day 22 successfully..!!";
}
#endregion
Вывод в консоль
Demonstrating BAD Method:
Buffer filled with value: 170
Buffer used and will be discarded after method execution.
Demonstrating GOOD Method:
Buffer filled with value: 187
Buffer rented from the pool and returned after use.
Полный код на GitHub
GitHub — ssukhpinder/30DayChallenge.Net
Программирование на C#🚀
Спасибо, что являетесь частью сообщества C#! Прежде чем уйти:
Следуйте за нами: Youtube | X | LinkedIn | Dev.to Посетите другие наши платформы: GitHub. Дополнительную информацию можно найти на странице Программирование на C#
Оригинал