Поточно-безопасный пул памяти

Мое приложение в настоящее время очень критично к производительности и запрашивает 3-5 миллионов объектов за кадр. Первоначально, чтобы сдвинуть дело с мертвой точки, я обновил все, заставил приложение работать и протестировать мои алгоритмы. Приложение многопоточное.

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

Итак, я начал создавать простой менеджер памяти, используя TBB concurrent_queue . В очереди хранится максимальный набор элементов, которые разрешено использовать приложению. Класс, требующий новых элементов, выталкивает элементы из очереди. Согласно документации Intel, метод try_pop не требует блокировки. Это сработало довольно хорошо с точки зрения потребления памяти (хотя фрагментация памяти все еще присутствует, но не так сильно, как раньше). Проблема, с которой я столкнулся сейчас, заключается в том, что приложение ' производительность снизилась примерно в 4 раза, согласно моему собственному простому профилировщику (у меня нет доступа к коммерческим профилировщикам и я не знаю ни одного, который будет работать в приложении реального времени ... любые рекомендации будут оценены).

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

РЕДАКТИРОВАТЬ: Я думал, что объясню проблему немного подробнее. Я мог легко инициализировать n количество массивов, где n - количество потоков, и начать использовать объекты из массивов для каждого потока. В некоторых случаях это сработает идеально. В моем случае, Я также перерабатываю элементы (потенциально каждый кадр), и они могут быть переработаны в любой точке массива; то есть это может быть часть массива elementArray [0] или elementArray [10] или elementArray [1000] . Теперь у меня будет фрагментированный массив элементов, состоящий из элементов, готовых к использованию, и элементов, которые используются: (

13
задан Samaursa 20 April 2011 в 22:38
поделиться