Вот мой код, мой unordered_map и карта ведут себя одинаково и принимают одно и то же время для выполнения. Я что-то пропустил об этих структурах данных?Почему unordered_map и карта дают такую же производительность?
Обновление: я изменил свой код на основе приведенных ниже ответов и комментариев. Я удалил операцию строки, чтобы уменьшить влияние на профилирование. Также теперь я только измеряю find(), который занимает почти 40% процессора в моем коде. Профиль показывает, что 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 или больше и посмотрите, что произойдет. –
Ваш код на самом деле ничего не замечает с картами, поэтому вполне вероятно, что оптимизатор просто удалил его. – juanchopanza
Скомпилируйте с полной оптимизацией и увеличьте количество итераций несколькими степенями десять и посмотрите, не изменилось ли это. – Galik