медленное выделение памяти в boost-interprocess - PullRequest
3 голосов
/ 03 октября 2011

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

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 Ответ

0 голосов
/ 03 октября 2011

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

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

...