пулы памяти: улучшат ли они использование кэша для структур, размер которых превышает размер строки кэша? - PullRequest
2 голосов
/ 06 сентября 2011

Насколько я понимаю, пулы памяти должны улучшить производительность кэша для объектов, к которым обычно обращаются вместе, если объекты меньше, чем размер строки кэша, потому что тогда смежные объекты, вероятно, будут извлечены в кэш одновременно.

Но как быть с объектами, размер которых превышает размер строки кэша?Есть ли польза от объединения таких данных в одну и ту же область памяти?

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 06 сентября 2011

Одной из важных причин использования пулов является то, что они предусматривают гораздо более простую схему распределения, чем распределитель общего назначения.Поскольку все объекты имеют одинаковый размер, фрагментация отсутствует, и вам просто нужно поддерживать свободный список.Для нового размещения вы пытаетесь выскочить из верхней части свободного списка, или, если список пуст, вы увеличиваете верхний водяной знак, готово.(Вы можете реализовать свободный список в пространстве O (1) внутри самой памяти пула.)

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

1 голос
/ 06 сентября 2011

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

0 голосов
/ 06 сентября 2011

Мой предыдущий проект был встроенным приложением со встроенным веб-сервером для платформы ARM SAM9x.Он имеет кучу всего 64 КБ и не имеет консоли / дисплея или файловой системы, поэтому нет способа просто printf () выдать ошибку stderr или записать ее в файл.Хотя он должен работать 7/24, он не должен останавливаться с ошибкой «недостаточно памяти», он должен работать без ошибок.Если это началось однажды, это никогда не остановится.Недостаточно памяти - это неустранимая ошибка, это полный сбой системы.

Итак, я решил не использовать new .Я использовал массивы объектов: кольцевые буферы, пулы фиксированного размера и т. Д. - и это просто работает.Java (и C # и т. Д.) Делают нас не правыми, эти современные языки говорят, что память - это большой океан, из которого любой может окунуться.Да, это правда, если у вас есть много, но цена высока, как вы упоминали в этом посте.

Попробуйте!Используйте как можно меньше new (и, конечно, malloc () ).Хороший побочный эффект: вам не нужно использовать delete free () ), проблем с утечкой памяти не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...