【发布时间】:2014-09-19 20:56:15
【问题描述】:
我有大量数据被读入内存 - 暂时,但对系统来说是必需的。
我一直在检查std::vector 和std::unordered_map 的性能。
对于std::vector,我使用了struct 类型:
struct information{
std::string name;
unsigned int offset;
}
对于std::unordered_map,我使用std::string 作为键,使用unsigned int offset 作为值。
假设,其中 2 000 000 个已加载到内存中,我尝试了以下操作并得到了以下结果:
std::vector:
在随机字符串上,如果在向量上调用了保留,则永远不会超过 32 个字符。
std::vector<information> vec;
vec.reserve(2500000);
插入
vec.push_back({dataName, offset});
相当快。但是,尝试查找数据非常缓慢。发现是这样实现的:
auto it = std::find_if(vec.begin(), vec.end(), [&name](information &info) -> bool {return info.name == name); });
看到它是一个大向量并且在名称比较中找到正确的struct,这是有道理的。但这是极其糟糕的表现。使用的内存很好 - 我认为内存增长的一部分是由于 std::string 大小调整造成的。
我对向量实现的问题是:有没有办法增加查找时间?我知道可以对向量进行排序以增加您的查找时间,但是您会浪费时间对向量进行排序。尤其是在这种大小的向量上。
std::unordered_map:
插入
std::unordered_map<std::string, unsigned int> unordMap;
unordMap.reserve(2500000);
unordMap.emplace(name, offset);
需要很长时间。当预先保留空间以尝试缩短插入时间时,会发生以下情况:
不调用reserve的时候插入结束的内存要多很多,不调用reserve的内存还是比vector的实现多很多。保留并没有真正改善插入时间。
当然,查找速度非常快。我对std::unordered_map 的问题是可以提高插入时间和内存使用率吗?
如果这些都做不到,那么我的下一个问题可能会很明显。有没有办法在这两个数据结构之间得到结果?什么最适合大量数据?
【问题讨论】:
-
您失去对向量进行排序的时间只有一次,如果您进行大量查找,则排序将不会明显。您可以稍后使用 二分搜索 进行查找。
-
我相信你打错了
push_back()那里 -
另外,虽然你选择
unordered_map这一事实可能暗示了这一点,但我还是会问:你能有重复的字符串吗? -
“有没有办法增加查找时间”...你的意思是查找速度?
-
你在使用 Visual Studio 吗?
标签: c++ c++11 vector stl unordered-map