Карта и набор, который использует непрерывную память и имеет резервную функцию - PullRequest
24 голосов
/ 01 января 2011

Я использую несколько карт и наборов. Недостаток производительности - недостаток непрерывной памяти и большое количество (де) выделений. Мне нужна в основном STL-совместимая карта и набор классов, которые могут использовать непрерывный блок памяти для внутренних объектов (или несколько блоков). Он также должен иметь функцию reserve, чтобы я мог предварительно выделить ожидаемые размеры.

Прежде чем написать свое, я хотел бы сначала проверить, что доступно. Есть ли что-то в Boost, что делает это? Кто-нибудь знает о доступной реализации в другом месте?


Типы навязчивых коллекций здесь нельзя использовать, поскольку одни и те же объекты должны существовать в нескольких коллекциях. Насколько я знаю, пулы памяти STL относятся к каждому типу, а не к одному экземпляру (вроде как, многие предостережения). Эти глобальные пулы не эффективны в отношении локальности памяти при обработке mutli-cpu / core.

Пулы объектов не работают, поскольку типы будут совместно использоваться экземпляром, но их пул не должен.

Во многих случаях хэш-карта может быть опцией.

Ответы [ 5 ]

14 голосов
/ 01 января 2011

Посмотрите на это: Google Sparse Hash Map .Это была моя любимая библиотека C ++ с тех пор, как я наткнулся на нее несколько лет назад.

Ее производительность невероятна, у нее есть и карта, и заданный класс, и запрошенные резервные функции.Я переключил бесчисленные проекты с различных других подобных карту структур данных на google sparsehash с невероятными результатами.Синтаксис совместим с C ++ 0x unordered_map (ужасное, ужасное имя!), Но также имеет дополнительные функции и возможности.

Внутренне он реализован с помощью хеш-таблицы с использованиемТехника разреженного хэширования.

РЕДАКТИРОВАТЬ (13 мая 2015 г.)

Поскольку это стало популярным ответом, я просто хотел указать на две другие подобные карте структуры, которые я использовал в последние годы.Библиотека M различна C ontainer T emplates (MCT) предоставляет встроенные высокопроизводительные реализации unorderd_map в нескольких вариантах:

Предоставляет шесть контейнеров хеш-таблицы общего назначения - closed_hash_set, closed_hash_map, connected_hash_set, connected_hash_map, forward_hash_set и forward_hash_map.Первые два очень похожи на TR1 unordered_set и unordered_map.Связанные предоставляют дополнительную функциональность, в то время как прямые хеш-таблицы более эффективны, чем связанные, но имеют ограниченный интерфейс.В некоторых случаях производительность контейнеров closed_hash_ * может быть еще более улучшена с помощью дополнительной поддержки навязчивости.

И folly от Facebook имеет несколько действительно хороших структур.Они не имеют самозаменяемой замены unordered_map как таковой, но есть реализация unordered_map без блокировок / потокобезопасности, и построение порядка fbvector может привести к значительному увеличению производительности благодаря лучшему использованию памяти и расположению.

В моем тестировании для однопоточного кода Google dense_hash_map по-прежнему является моим предпочтительным вариантом для максимальной производительности.

6 голосов
/ 02 января 2011

Boost.Interprocess и Boost.Container предоставляют плоский набор и плоскую карту, которые могут помочь вам улучшить производительность вашего приложения.

См. https://svn.boost.org/svn/boost/sandbox/move/libs/container/doc/html/boost_container_reference.html#header.boost.container.flat_set_hpp

6 голосов
/ 01 января 2011

Вы можете просто использовать вектор и двоичный поиск для непрерывного хранения и Reserve (), а также для поддержания O (logn).Впрочем, вставка будет дороже.

6 голосов
/ 01 января 2011

Недавняя запись в списке рассылки Boost обсуждала нечто похожее на это.

Говард Хиннант создал распределитель, который может использовать стек вместо кучи.

http://howardhinnant.github.io/stack_alloc.html

1 голос
/ 01 января 2011

Возможно, вы захотите взглянуть на Google TCMalloc . Это замена для замены malloc, которая может ускорить вашу программу. TCMalloc специально разработан для нескольких потоков.

...