Огромное количество создания объектов в C ++ - PullRequest
2 голосов
/ 04 марта 2010

Есть ли какой-нибудь шаблон, как работать с множеством экземпляров объектов (40 Кбит / с) на мобильном устройстве? Мне нужны эти объекты отдельно, и они не могут быть объединены. Повторное использование объектов, вероятно, будет решением. Есть намеки?

Ответы [ 7 ]

7 голосов
/ 04 марта 2010

Да. Храните старые объекты в бассейне и используйте их, если можете. Вы сэкономите огромное количество времени благодаря стоимости выделения и удаления памяти.

3 голосов
/ 04 марта 2010

Я думаю, вы могли бы рассмотреть эти шаблоны проектирования:

  • Пул объектов
  • Завод

Дополнительная информация

Надеюсь, вам это тоже поможет: Объединение объектов для классов C ++ общего типа

2 голосов
/ 04 марта 2010

Вы можете использовать шаблон flyweight, если ваши объекты избыточны. Этот шаблон разделяет память среди похожих объектов. Классическим примером является структура данных, используемая для графического представления символов в программе обработки текста.

В Википедии есть резюме .

Имеется реализация в ускорении.

2 голосов
/ 04 марта 2010

Если все объекты имеют одинаковый размер, попробуйте простой распределитель ячеек с навязчивым связанным списком свободных узлов:

free:
    add node to head of list

allocate:
    if list is non-empty:
        remove the head of the list and return it
    else:
        allocate a large block of memory
        split it into cells of the required size
        add all but one of them to the free list
        return the other one

Если выделение и освобождение выполняются в одном потоке, то вы нене нужно никакой синхронизацииЕсли они выполняются в разных потоках, то, возможно, переключение контекста на 40 Кбит / с вызывает больше беспокойства, чем распределение на 40 Кбит / с; -)

Вы можете сделать ячейки просто «необработанной памятью» (и использовать размещениеnew или оператор перегрузки (new для вашего класса), либо оставляйте объекты инициализированными всегда, даже когда они находятся в «свободном списке», и присваивайте любые значения, которые вам нужны, членам «новых».То, что вы делаете, зависит от того, насколько дорогая инициализация, и, вероятно, от технической разницы между распределителем ячеек и пулом объектов.

1 голос
/ 04 марта 2010

Трудно сказать точно, как улучшить ваш код без дополнительной информации, но вы, вероятно, хотите проверить библиотеки Boost Pool . Все они предоставляют разные способы быстрого выделения памяти для разных конкретных случаев использования. Выберите тот, который лучше всего подходит для вашего случая использования.

0 голосов
/ 04 марта 2010

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

Основная идея заключается в следующем:

  • Создайте распределитель, который выделяет большие массивы желаемого объекта;требует, чтобы у этого объекта был указатель «следующий» (обычно я создаю шаблон, который оборачивает объект указателем «следующий»).
  • Каждый раз, когда вам нужен объект, получите его из этого распределителя (используя синтаксис newкоторый инициализируется из блока памяти, который вы вызываете).
  • Каждый раз, когда вы закончите, верните его распределителю и поместите в стек.
  • Распределитель дает вам что-то отstack, если стек непустой, или что-то из его буфера массива в противном случае.Если у вас заканчивается буфер, вы можете либо выделить другой больший буфер и скопировать существующие используемые узлы, либо заставить распределитель поддерживать стек полностью использованных блоков выделения.
  • Когда вы закончите со всеми объектами,удалить распределитель.Дополнительное преимущество: вам не нужно обязательно освобождать каждый отдельный объект;они все уйдут.Дополнительные затраты: лучше выделить все, что вы хотите сохранить навсегда, в куче, а не в этом временном буфере (или использовать постоянный буфер, который вы используете).

Я обычно получаю производительность поПри использовании этого подхода в 10 раз лучше, чем в raw malloc / new.

0 голосов
/ 04 марта 2010

Если объекты имеют одинаковый размер, вы можете выделить большой кусок памяти и использовать placement new, что поможет с распределением затрат, поскольку все они будут в смежной памяти:

Object *pool = malloc( sizeof(Object) * numberOfObjects );
for(int i=0; i<numberOfObjects; i++)
    new (&pool[i]) Object()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...