我在std :: map上执行了大量的查找,插入和删除操作。我正在考虑添加一些代码来优化速度,但我想收集一些有关当前工作负载的统计信息。具体来说,我想跟踪每次调用时有多少节点“查找”需要遍历,这样我才能保持正常运行。
我想如果我的地图中的大多数更改都发生在前面,那么在使用“找到”使用的树之前,我最好先搜索前N个条目。
答案 0 :(得分:1)
Find必须使用map的compare函数比较元素,这样你就可以提供一个自定义比较函数来计算它被调用的次数,以便查看它在每次调用时所做的工作量(基本上是多少个节点)遍历)。
我没有看到在调用find()之前搜索前N个条目在这种情况下可能会有所帮助。迭代遍历映射中的条目只是按排序顺序遍历树,因此除了调用find()之外它不会更有效率,除非你的比较函数比检查相等性要贵得多。
示例代码:
#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <vector>
using namespace std;
int main() {
vector<int> v(100);
iota(begin(v), end(v), 0);
vector<pair<int, int>> vp(v.size());
transform(begin(v), end(v), begin(vp), [](int i) { return make_pair(i, i); });
int compareCount = 0;
auto countingCompare = [&](int x, int y) { ++compareCount; return x < y; };
map<int, int, decltype(countingCompare)> m(begin(vp), end(vp), countingCompare);
cout << "Compares during construction: " << compareCount << "\n";
compareCount = 0;
auto pos = m.find(50);
cout << "Compares during find(): " << compareCount << "\n";
}
答案 1 :(得分:0)
如果您的键/值结构可行,则值得考虑unordered_map
(在C ++ 11或TR1中)作为替代方案。 std::map
,作为一个平衡的树,在这个使用情况下不太可能表现良好,而且你搜索前N个的混合方法对我来说似乎很多工作而没有保证的收益。