Здесь есть много чего почитать, и оптимизация сложных типов контейнеров является сложной задачей. Я потратил немало времени, работая над подобными проблемами, поэтому постараюсь указать на некоторые вещи, которые мне помогли.
Во-первых, обычный способ сделать ваш код быстрее: не использовать двоичные деревья, когда векторы будут делать . Реализация Microsoft STL будет тратить около 14 байт (3 указателя + короткое int для красного / черного флага, которое я недавно проверял) на служебные расходы для каждого узла в вашей карте / наборе, а также служебную нагрузку malloc как минимум еще на 4 байта, прежде чем она обойдет. для хранения данных вашего узла. Хотя я не очень хорошо знаю специфику вашего домена, ввод-вывод с отображением памяти кажется мне областью, где, вероятно, существует сложное, но более быстрое векторное решение. Это потребовало бы, чтобы число блоков, которые вы отображаете одновременно, было небольшим - если ваша таблица поиска не превышает 6000 байтов, реализация отсортированного массива с memmove для вставки / стирания и двоичным_поиском для поиска, вероятно, будет быстрее в Режим выпуска (и в режиме отладки, к сожалению, он будет быстрее до нескольких мегабайт). Если элементы являются 4-байтовыми указателями, то 6000 байтов позволяют разместить до 1500 отображенных блоков.
Однако иногда вам просто нужно использовать деревья. Один случай - это сложные узлы (так что создание / уничтожение имеет важное значение) или довольно большое количество элементов (так что вставка массива O (N) становится медленнее, чем стоимость malloc для вставки дерева O (log n)). Что вы можете сделать здесь? Обратите внимание, что map / multimap и set / multiset или почти одинаковая скорость; мульти * версии имеют тенденцию быть немного медленнее, но только потому, что код для их обработки на несколько строк длиннее.
В любом случае, одна вещь, которая может очень помочь, - это выяснить, как сократить стоимость malloc, поскольку каждый узел будет вызывать malloc / free в какой-то момент. Обрезка, которая трудная - распределитель режима Release примерно эквивалентен примерно 50-200 арифметическим операциям, поэтому, хотя он и выполним, он требует определенных усилий. Однако у вас есть некоторая надежда - все распределения карт / наборов имеют одинаковый размер, поэтому пул памяти может работать очень хорошо. Google , вероятно, хороший способ начать; Есть много хороших статей на эту тему.
Наконец, есть профилировщик выборки с открытым исходным кодом, который я считаю очень полезным - он называется Very Sleepy и обычно просто работает в проектах Visual Studio. Если вы хотите точно ответить, быстрее ли в вашем случае map / multimap или set / multiset, на это я бы вам указал. Удачи!