我有一个非常大的项目列表(约2百万),我想优化访问速度。我使用迭代器(++ it)迭代这些项目
现在,代码是使用std:map<std::wstring, STRUCT>
实现的
我想知道用std::deque<std::pair<std::wstring, STRUCT>>
更改std :: map是否值得。我想我会利用指针算法和最小化缓存未命中。值得吗?
我知道分析是答案,但在实现这个之前我需要一个意见......
答案 0 :(得分:2)
如果事先知道尺寸,那么std :: Vector显然是你的对象不太大的方式。
std::vector<Object> list;
list.reserve(2000000);
然后像往常一样填写。
这是最快且耗能最少的方法。但是,您需要能够分配enought连续内存。但是,如果你的物体是1kb大,那就不是问题了。
答案 1 :(得分:1)
使用deque,您将失去(或将不得不重新实现)Key-Value对的优势。如果它对您的数据不重要,我会考虑使用deque。
答案 2 :(得分:1)
一般来说,如果你只是在这个集合中进行搜索(没有插入/删除),你可能最好使用一个排序的顺序投币器,如deque或vector。然后,您可以使用简单的二进制搜索来查找所需的元素。使用顺序容器的优点是它在内存使用方面更好,具有非常简单的实现,并提供更好的引用局部性。我使用vector编写了一个代码版本,使用deque编写了另一个代码版本,然后根据性能进行比较,以确定在最终版本中使用哪一个。
但是,如果您的结构需要更新(需要插入新元素或必须经常删除旧元素),那么map是更好的选择。或者,您可能只需要完全删除STL容器并使用内存数据库(请参阅SQLite),但这在很大程度上取决于您正在解决的问题。
答案 3 :(得分:1)
要迭代的最快容器通常是vector
,因此如果您想以牺牲其他所有内容为代价来优化迭代,请使用它。
整体应用程序性能当然取决于您迭代的次数,以及您如何构建数据。对于简单的测试,一旦填充了地图,就可以按如下方式构建一个向量:
vector<pair<K,V> > myvec(mymap.begin(), mymap.end());
其中K和V是地图的键和值类型。然后使用向量迭代器代替map迭代器并比较性能。
当然,如果你想在将来修改地图,那么通常以牺牲其他一切为代价优化迭代是不合适的。