медленное выделение памяти в boost-interprocess

#c #boost #memory-management #boost-interprocess

#c #boost #управление памятью #boost-interprocess

Вопрос:

Это выглядит так:

 MyType * pMy = my_segment->construct<MyType>(anonymous_instance)();
my_segment->destroy_ptr(pMy);
  

Где MyType — это некоторая типичная структура, а my_segment правильно сконструирован boost::interprocess::managed_shared_memory *
примерно в 10 раз медленнее, чем эквивалентный:

 MyType * pMy = new MyType();
delete pMy;
  

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

Редактировать: тест проводился в течение огромного количества итераций.

Ответ №1:

Попробуйте несколько распределений и посмотрите, все ли они медленные или только первое. Если только первый медленный, это может быть связано с тем, что страница, поддерживающая разделяемую память, должна быть зафиксирована (а не просто зарезервирована). Если страница зафиксирована, ее все равно может потребоваться выгрузка (из файла страницы / подкачки).

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

Комментарии:

1. Тест производительности проходил через огромное количество итераций. Я думаю, ваше второе предположение может быть верным.