Мое приложение в настоящее время имеет критическую производительность и запрашивает 3-5 миллионов объектов на фрейм. Первоначально, чтобы получить мяч, я new'd
все и получил приложение для работы и тестирования моих алгоритмов. Приложение многопоточное.
Как только я был доволен производительностью, я начал создавать диспетчер памяти для своих объектов. Очевидная причина - фрагментация памяти и потери. Приложение не могло продолжить работу более чем на несколько кадров перед сбоем из-за фрагментации памяти. Я проверил утечку памяти и знаю, что приложение не содержит утечек.
Итак, я начал создавать простой диспетчер памяти, используя TBB concurrent_queue
. В очереди хранится максимальный набор элементов, которые разрешено использовать приложению. Класс, требующий новых элементов, выставляет элементы из очереди. Метод try_pop
, согласно документации Intel, не блокируется. Это работало достаточно хорошо, поскольку потребление памяти идет (хотя фрагментация памяти еще не так много, как раньше). Проблема, с которой я столкнулся сейчас, заключается в том, что производительность приложения замедлилась примерно в 4 раза в соответствии с моим собственным простым профилировщиком (у меня нет доступа к коммерческим профайлерам или знаю о том, что будет работать в приложении реального времени... любая рекомендация будет оценена).
Мой вопрос: есть ли потокобезопасный пул памяти, который является масштабируемым. A must-have
Особенность пула - быстрая утилизация элементов и их доступность. Если их нет, можно ли использовать некоторые советы/трюки?
EDIT: Я думал, что я объясню проблему немного больше. Я мог бы легко инициализировать n количество массивов, где n - количество потоков и начать использовать объекты из массивов на поток. В некоторых случаях это будет отлично работать. В моем случае я повторно использую элементы (потенциально каждый кадр), и они могут быть переработаны в любой точке массива; то есть может быть от elementArray[0]
или elementArray[10]
или elementArray[1000]
части массива. Теперь у меня будет фрагментированный массив элементов, состоящий из элементов, которые готовы к использованию, и элементов, которые используются: (