当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 无序集(const char)比无序集(字符串)慢得多

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在从磁盘加载一个非常长的列表到一个unordered_set.如果我使用一组字符串,它会非常快.大约1 MB加载的测试列表,大约1秒钟.但是,使用一组char指针大约需要2.1分钟! 以下是字符串版本
我正在从磁盘加载一个非常长的列表到一个unordered_set.如果我使用一组字符串,它会非常快.大约1 MB加载的测试列表,大约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.

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

开始了.

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