Русская Википедия:Объектный пул

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Значения Шаблон:Шаблон проектирования Объектный пул (Шаблон:Lang-en) — порождающий шаблон проектирования, набор инициализированных и готовых к использованию объектов. Когда системе требуется объект, он не создаётся, а берётся из пула. Когда объект больше не нужен, он не уничтожается, а возвращается в пул.

Применение

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

Объектный пул удобен, если объект владеет другими ресурсами, кроме памяти — например, сетевыми сокетами. Либо если коллекция объектов отнимает значительную часть памяти компьютера и «мусора» создаётся действительно много.

Переполнение

Если в пуле нет ни одного свободного объекта, возможна одна из трёх стратегий:

  1. Расширение пула.
  2. Отказ в создании объекта, аварийная остановка.
  3. В случае многозадачной системы можно подождать, пока один из объектов не освободится.

Примеры

  1. Информация об открытых файлах в DOS.
  2. Информация о видимых объектах во многих компьютерных играх (хорошим примером является движок Doom). Эта информация актуальна только в течение одного кадра; после того, как кадр выведен, список опустошается.
  3. Компьютерная игра для хранения всех объектов на карте, вместо того, чтобы использовать обычные механизмы распределения памяти, может завести массив такого размера, которого заведомо хватит на все объекты, и свободные ячейки держать в виде связного списка. Такая конструкция повышает скорость, уменьшает фрагментацию памяти и снижает нагрузку на сборщик мусора (если он есть).

Ловушки

Шаблон:Anchor

  1. После того, как объект возвращён, он должен вернуться в состояние, пригодное для дальнейшего использования. Если объекты после возвращения в пул оказываются в неправильном или неопределённом состоянии, такая конструкция называется объектной клоакой (Шаблон:Lang-en).
  2. Повторное использование объектов также может привести к утечке информации. Если в объекте есть секретные данные (например, номер кредитной карты), после освобождения объекта эту информацию надо затереть.
  3. Многопоточный объектный пул написать не так просто.
  4. На 2020-е годы в языках со сбором мусора управление памятью хорошо оптимизировано под постоянное выделение-отдачу. Так что, если объект занимает только память, руководства по Java не рекомендуют пользоваться пулами: обычный new требует всего десять процессорных команд. А сборщики мусора часто сканируют ссылки на объекты, а не их память — потому чем больше в памяти «живых» объектов, тем ниже производительность такого сборщика.

Пример реализации

Пример на Python

Шаблон:Hider hiding

Пример на C++

Шаблон:Hider hiding Из примера для простоты убраны шаблоны и потокозащищенность. При необходимости использования пула в нескольких потоках следует защитить тело методов createNewObject и deleteObject от одновременного выполнения каким-либо подходящим объектом синхронизации, например, критической секцией или мьютексом.

Пример на C#

Шаблон:Hider hiding Шаблон:Hider hiding Шаблон:Hider hiding Шаблон:Hider hiding

Пример на VB.NET

Шаблон:Hider hiding Шаблон:Hider hiding Шаблон:Hider hiding Шаблон:Hider hiding

Пример на Perl

Шаблон:Hider hiding

Ссылки

Шаблон:Типы Паттернов