межпроцессная карта против карты / unordered_map - PullRequest
1 голос
/ 24 ноября 2010

Существует множество дискуссий о различиях между std :: map и boost :: unordered_map. Но как насчет boost :: interprocess :: map?

Кто-нибудь проводил тесты производительности между boost :: interprocess :: map и std :: map?

Я не так часто использовал interprocess :: map, но у меня такое ощущение, что при использовании элементов размером более 1 миллиона он становится очень медленным.

Спасибо

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Межпроцессные контейнеры Boost являются стандартными контейнерами с пользовательскими распределителями.

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

Таким образом, классы распределителя, относящиеся к boost::interprocess, включают дополнительную арифметику при разыменовании. Они определяют пользовательский тип pointer, который немного тяжелее в использовании, чем обычные указатели.

Кроме того, контейнеры точно такие же, как стандартные. Та же сложность и только небольшие накладные расходы при доступе к элементу (дополнительное дополнение). Например, различия между map и unordered_map будут отражены как есть при использовании специального межпроцессного распределителя.

1 голос
/ 24 ноября 2010

Этот комментарий есть в файле boost / interprocess / container / container / map.hpp:

// This file comes from SGI's stl_map/stl_multimap files. Modified by Ion Gaztanaga.
// Renaming, isolating and porting to generic algorithms. Pointer typedef 
// set to allocator::pointer to allow placing it in shared memory.

Таким образом, различия в производительности связаны с разницей в производительности используемых распределителей, которые зависят от типа совместного использования и операционной системы.

1 голос
/ 24 ноября 2010

Это не значимое сравнение.Они используются для совершенно разных целей.

interprocess :: map используется для обмена данными между процессами.std :: map используется внутри одного процесса.

...