Сначала отключите все профилирование и переключатели DEBUG. Это может сильно замедлить STL.
Если это не так, частью проблемы может быть то, что ваши строки идентичны для первых 80-90% строки. Это не плохо для карты, обязательно, но для сравнения строк. Если это так, ваш поиск может занять гораздо больше времени.
Например, в этом коде find (), скорее всего, приведет к нескольким сравнениям строк, но каждый вернется после сравнения первого символа до «david», а затем будут проверены первые три символа. Таким образом, самое большее, 5 символов будут проверены за вызов.
map<string,int> names;
names["larry"] = 1;
names["david"] = 2;
names["juanita"] = 3;
map<string,int>::iterator iter = names.find("daniel");
С другой стороны, в следующем коде find (), скорее всего, проверит 135+ символов:
map<string,int> names;
names["/usr/local/lib/fancy-pants/share/etc/doc/foobar/longpath/yadda/yadda/wilma"] = 1;
names["/usr/local/lib/fancy-pants/share/etc/doc/foobar/longpath/yadda/yadda/fred"] = 2;
names["/usr/local/lib/fancy-pants/share/etc/doc/foobar/longpath/yadda/yadda/barney"] = 3;
map<string,int>::iterator iter = names.find("/usr/local/lib/fancy-pants/share/etc/doc/foobar/longpath/yadda/yadda/betty");
Это потому, что сравнения строк должны искать глубже, чтобы найти совпадение, так как начало каждой строки одинаково.
Использование size () в вашем сравнении на равенство не очень вам поможет, так как ваш набор данных очень мал. Std :: map сохраняется отсортированным, поэтому его элементы можно искать с помощью двоичного поиска. Каждый вызов для поиска должен приводить к менее чем 5 сравнениям строк для промаха и в среднем 2 сравнениям для попадания. Но это зависит от ваших данных. Если большинство ваших строк пути имеют разную длину, то проверка размера, как описывает Мотти, может очень помочь.
При размышлении об альтернативных алгоритмах нужно учитывать, сколько «ударов» вы получаете. Является ли большинство ваших вызовов find () возвращением end () или попаданием? Если большинство из ваших find () возвращают end () (пропускает), то вы каждый раз просматриваете всю карту (сравнение строк 2logn).
Hash_map - хорошая идея; это должно сократить ваше время поиска примерно вдвое для хитов; больше для промахов.
Может потребоваться собственный алгоритм из-за природы строк пути, особенно если ваш набор данных имеет общее происхождение, как в приведенном выше коде.
Еще одна вещь, которую нужно учитывать, это то, как вы получаете строки поиска. Если вы используете их повторно, это может помочь кодировать их во что-то, что будет легче сравнивать. Если вы используете их один раз и отбрасываете их, то этот шаг кодирования, вероятно, слишком дорогой.
Однажды (давным-давно) я использовал что-то вроде дерева кодирования Хаффмана для оптимизации поиска строк. Подобное дерево поиска в двоичной строке может быть более эффективным в некоторых случаях, но довольно дорого для небольших наборов, подобных вашему.
Наконец, рассмотрим альтернативные реализации std :: map. Я слышал плохие вещи о производительности кода VC stl. В частности, библиотека DEBUG плохо проверяет вас при каждом вызове. StlPort была хорошей альтернативой, но я не пробовал ее несколько лет. Я всегда любил Повышение тоже.