#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. Тест производительности проходил через огромное количество итераций. Я думаю, ваше второе предположение может быть верным.