gpt4 book ai didi

performance - 无序集(const char)比无序集(字符串)慢得多

转载 作者:行者123 更新时间:2023-12-04 20:21:03 26 4
gpt4 key购买 nike

我正在将一个很长的列表从磁盘加载到 unordered_set 中。如果我使用一组字符串,则速度非常快。在大约 1 秒内加载大约 7 MB 的测试列表。但是,使用一组字符指针大约需要 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 字符串这样的小对象。但是,我已经用常规的"new"测试了它,结果是相同的。我还在其他工具中使用了我的内存管理器,没有任何问题。

这两个结构是根据实际的 c 字符串而不是其地址进行插入和查找哈希所必需的。 unordered_deref 我实际上是在堆栈溢出时在这里找到的。

最终我需要加载多千兆字节的文件。这就是我使用自定义内存管理器的原因,但这也是为什么这种可怕的减速是 Not Acceptable 。有任何想法吗?

最佳答案

开始了。

struct unordered_deref
{
size_t operator()(const char* p) const
{
return hash<string>()(p);
}
};

关于performance - 无序集(const char)比无序集(字符串)慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com