Я загружаю очень длинный список с диска в 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, который я нашел здесь при переполнении стека.
В конце концов, мне нужно загрузить файлы размером в несколько гигабайт. Вот почему я использую специальный диспетчер памяти, но именно поэтому это ужасное замедление недопустимо. Есть идеи?