30-дневное испытание .NET. День 22. Использование пула массивов

30-дневное испытание .NET. День 22. Использование пула массивов

11 апреля 2024 г.

ArrayPool – механизм повторного использования временных буферов и оптимизации производительности за счет сокращения циклов сборки мусора.

Введение

Частое выделение и освобождение больших буферов может повлиять на производительность из-за увеличения нагрузки на сборщик мусора. Нам рекомендуется ArrayPool , механизм повторного использования временных буферов и оптимизации производительности за счет сокращения циклов сборки мусора.

Цели обучения

  • Понимание проблемы традиционного распределения буфера
  • Подход с использованием ArrayPool
  • Рекомендации по использованию ArrayPool

Необходимые требования для разработчиков

  • Базовое понимание языка программирования C#.

30-дневный конкурс .Net

Начало работы

Понимание проблемы традиционного распределения буфера

Общий подход, используемый разработчиками, предполагает прямое выделение нового буфера.

    // Allocating a new large buffer
    byte[] buffer = new byte[4096];

Хотя вышеупомянутый фрагмент кода выглядит чистым и понятным, он имеет существенные недостатки в отношении производительности, особенно в приложениях, которые часто запрашивают большие временные буферы. Каждое выделение увеличивает размер кучи, что приводит к более частой сборке мусора.

Подход с использованием ArrayPool

ArrayPool является частью пространства имен System.Buffers и предоставляет временные массивы, тем самым уменьшая необходимость частого выделения памяти и сбора мусора.

    // 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#


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE