Неупорядоченный набор (const char) намного медленнее, чем неупорядоченный набор (строка)

Я загружаю очень длинный список с диска в unordered_set. Если я использую набор струн, это очень быстро. Тестовый список размером около 7 МБ загружается примерно за 1 секунду. Однако использование набора указателей char занимает около 2,1 минуты!

Вот код для строковой версии:

unordered_set<string> Set;
string key;
while (getline(fin, key))
{
    Set.insert(key);
}

Вот код для версии char *:

struct unordered_eqstr
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) == 0;
    }
};

struct unordered_deref
{
    template <typename T>
    size_t operator()(const T* p) const
    {
        return hash<T>()(*p);
    }
};

unordered_set<const char*, unordered_deref, unordered_eqstr> Set;
string key;

while (getline(fin, key))
{
    char* str = new(mem) char[key.size()+1];
    strcpy(str, key.c_str());
    Set.insert(str);
}

«new (mem)» - это потому, что Я использую специальный диспетчер памяти, поэтому я могу выделять большие блоки памяти и отдавать их крошечным объектам, таким как строки c. Тем не менее, я тестировал это с обычным «новым», и результаты идентичны. Я также без проблем использовал свой менеджер памяти в других инструментах.

Две структуры необходимы для создания хэша вставки и поиска на основе фактической строки c, а не ее адреса. Unordered_deref, который я нашел здесь при переполнении стека.

В конце концов, мне нужно загрузить файлы размером в несколько гигабайт. Вот почему я использую специальный диспетчер памяти, но именно поэтому это ужасное замедление недопустимо. Есть идеи?

5
задан Matthew Alpert 30 June 2011 в 07:30
поделиться