【发布时间】:2016-08-29 07:12:26
【问题描述】:
这是我的代码,我的 unordered_map 和 map 的行为相同并且执行时间相同。我是否遗漏了这些数据结构的某些内容?
更新:我已根据以下答案和 cmets 更改了我的代码。我删除了字符串操作以减少分析的影响。现在我也只测量 find() ,它在我的代码中占用了近 40% 的 CPU。 profile 显示 unordered_map 快了 3 倍,但是,有没有其他方法可以让这段代码更快?
#include <map>
#include <unordered_map>
#include <stdio.h>
struct Property {
int a;
};
int main() {
printf("Performance Summery:\n");
static const unsigned long num_iter = 999999;
std::unordered_map<int, Property > myumap;
for (int i = 0; i < 10000; i++) {
int ind = rand() % 1000;
Property p;
p.a = i;
myumap.insert(std::pair<int, Property> (ind, p));
}
clock_t tStart = clock();
for (int i = 0; i < num_iter; i++) {
int ind = rand() % 1000;
std::unordered_map<int, Property >::iterator itr = myumap.find(ind);
}
printf("Time taken unordered_map: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
std::map<int, Property > mymap;
for (int i = 0; i < 10000; i++) {
int ind = rand() % 1000;
Property p;
p.a = i;
mymap.insert(std::pair<int, Property> (ind, p));
}
tStart = clock();
for (int i = 0; i < num_iter; i++) {
int ind = rand() % 1000;
std::map<int, Property >::iterator itr = mymap.find(ind);
}
printf("Time taken map: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
}
输出在这里
Performance Summery:
Time taken unordered_map: 0.12s
Time taken map: 0.36s
【问题讨论】:
-
0.06 非常接近大多数系统上标准时钟的分辨率,所以这一切都意味着两者都花费不到一个滴答声;将你的外循环乘以 100 或更多,看看会发生什么。
-
您的代码实际上并没有对地图进行任何可观察的操作,因此优化器很可能只是将其删除。
-
完全优化编译,将迭代次数增加十的几倍,看看是否有区别。
-
您正在测量字符串的创建和转换时间。
-
您应该预先说明您是否在打开优化的情况下进行编译。如果您正在编译未优化或“调试”版本,则结果毫无意义。
标签: c++ performance data-structures unordered-map