我一直在检查std::vector和std::unordered_map的性能。对于std::vector,我使用了一个类型为struct的结构体:
struct information{
std::string name;
unsigned int offset;
}
“对于std::unordered_map,我使用std::string作为键,unsigned int offset作为值。如果说,有2000000个这样的数据被加载到内存中,我尝试了以下操作并得到了以下结果:使用std::vector,在随机字符串上进行操作,如果在向量上调用了reserve函数,则字符串长度通常不会超过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时,插入完成后的内存比较大,但是仍然比vector实现多。reserve并不能真正提高插入时间。
当然查找速度非常快。我对于std::unordered_map的问题是:插入时间和内存使用能否得到改进?
如果这两个问题都无法解决,那么我的下一个问题可能很明显。是否有一种方法可以获得这两个数据结构之间的结果?哪种数据结构最适合处理大量数据?
push_back()
。 - Nasser Al-Shawwa