Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序

写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试根据上面的数据可以分析出在数据小于1000时,可以采取Map 。大于1000,小于10000时,如果需要排序,选用Map,不需要就unordered_map 。大于10000的时候没有特殊要求,采用Map 。另外,插入和读取如果有时间刚需,应该采用函数,而不是重载 。写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试
Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序配置配件信息CPUIntel? Pentium(R) CPU G3260 @ 3.30GHz × 2内存7.6 GiB系统Ubuntu 20.04.1 LTS编译器g++-9编译选项-O2简单数据(4 Byte)首先先上一组小数据
测试项目数据范围耗时(us)Map写入100094——Map读取100062unordered_map写入1000101——unordered_map读取100061可以看到数据较小时候是Map占优势
再来一组中等数据
测试项目数据范围耗时(us)Map写入100001682——Map读取100002703unordered_map写入100001160——unordered_map读取10000677【Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序】大于1000后就是unordered_map优势更大
特大数据下情况是
测试项目数据范围耗时(us)Map写入1000000855782——Map读取1000000811670unordered_map写入1000000267515——unordered_map读取1000000118495大数据便是unordered_map完全碾压
复杂数据(32 Byte)有人可能会说当数据很复杂时unordered_map容易引发冲突
测试项目数据范围耗时(us)Map写入100004064——Map读取100004569unordered_map写入100002139——unordered_map读取100001716和上面比较,发现数据变得更复杂时,Map更不如unordered_map了
重载和函数的速度另外测试还发现,无论是写入还是读取,用重载方法都要比函数慢,其中读取慢的更多 。
测试项目数据范围耗时(us)Map重载写入1000000906477——Map重载读取10000001115637Map函数写入1000000855782——Map函数读取1000000811670测试项目数据范围耗时(us)unordered_map重载写入1000000284470——unordered_map重载读取1000000276208unordered_map函数写入1000000267515——unordered_map函数读取1000000118495总结根据上面的数据可以分析出
在数据小于1000时,可以采取Map 。大于1000,小于10000时,如果需要排序,选用Map,不需要就unordered_map 。大于10000的时候没有特殊要求,采用Map 。
另外,插入和读取如果有时间刚需,应该采用函数,而不是重载 。
原始数据与测试程序如果有人需要原始数据,可以看看 。
int 4mapoperator#include <iostream>#include <cstdlib>#include <ctime>#include <map>using namespace std;int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){map<int, int> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M[rand()] = rand();cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M[rand()];cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2611Reading spends311Writing spends1110Reading spends2110Writing spends01100Reading spends151100Writing spends111000Reading spends13411000Writing spends2110000Reading spends1781110000Writing spends41100000Reading spends481451100000Writing spends711000000Reading spends82306911000000Writing spends7101Reading spends1101Writing spends11010Reading spends21010Writing spends110100Reading spends1310100Writing spends1101000Reading spends217101000Writing spends21010000Reading spends29711010000Writing spends510100000Reading spends11956510100000Writing spends9101000000Reading spends947049101000000Writing spends181001Reading spends11001Writing spends1010010Reading spends210010Writing spends9100100Reading spends17100100Writing spends81001000Reading spends2311001000Writing spends1110010000Reading spends345710010000Writing spends14100100000Reading spends86540100100000Writing spends241001000000Reading spends13503111001000000Writing spends16610001Reading spends210001Writing spends147100010Reading spends3100010Writing spends1331000100Reading spends241000100Writing spends13210001000Reading spends24510001000Writing spends143100010000Reading spends3755100010000Writing spends2001000100000Reading spends1158021000100000Writing spends21910001000000Reading spends95076910001000000Writing spends2963100001Reading spends1100001Writing spends29881000010Reading spends61000010Writing spends290510000100Reading spends4310000100Writing spends4573100001000Reading spends1448100001000Writing spends34921000010000Reading spends128811000010000Writing spends288010000100000Reading spends10148310000100000Writing spends2951100001000000Reading spends935608100001000000Writing spends495351000001Reading spends21000001Writing spends7061210000010Reading spends810000010Writing spends76232100000100Reading spends76100000100Writing spends804571000001000Reading spends7901000001000Writing spends8443210000010000Reading spends967710000010000Writing spends78376100000100000Reading spends97320100000100000Writing spends695741000001000000Reading spends9655081000001000000Writing spends90361310000001Reading spends310000001Writing spends907309100000010Reading spends12100000010Writing spends9166171000000100Reading spends1191000000100Writing spends91736010000001000Reading spends117710000001000Writing spends904860100000010000Reading spends12960100000010000Writing spends9052971000000100000Reading spends1274721000000100000Writing spends90647710000001000000Reading spends111563710000001000000insert & find#include <iostream>#include <cstdlib>#include <ctime>#include <map>using namespace std;int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){map<int, int> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M.insert(make_pair(rand(), rand()));cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M.find(rand());cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2611Reading spends111Writing spends1110Reading spends1110Writing spends01100Reading spends21100Writing spends011000Reading spends1211000Writing spends1110000Reading spends109110000Writing spends11100000Reading spends10861100000Writing spends111000000Reading spends1075711000000Writing spends3101Reading spends1101Writing spends21010Reading spends11010Writing spends110100Reading spends310100Writing spends1101000Reading spends19101000Writing spends11010000Reading spends1871010000Writing spends110100000Reading spends181310100000Writing spends2101000000Reading spends18350101000000Writing spends191001Reading spends41001Writing spends1210010Reading spends110010Writing spends7100100Reading spends5100100Writing spends71001000Reading spends371001000Writing spends710010000Reading spends36710010000Writing spends11100100000Reading spends3599100100000Writing spends111001000000Reading spends355901001000000Writing spends25910001Reading spends210001Writing spends107100010Reading spends2100010Writing spends991000100Reading spends91000100Writing spends9410001000Reading spends6210001000Writing spends95100010000Reading spends565100010000Writing spends991000100000Reading spends55841000100000Writing spends10110001000000Reading spends5597110001000000Writing spends1732100001Reading spends1100001Writing spends22301000010Reading spends41000010Writing spends264410000100Reading spends2810000100Writing spends1633100001000Reading spends188100001000Writing spends16821000010000Reading spends27031000010000Writing spends163810000100000Reading spends1432710000100000Writing spends1546100001000000Reading spends142330100001000000Writing spends673501000001Reading spends21000001Writing spends6965410000010Reading spends410000010Writing spends64137100000100Reading spends39100000100Writing spends679401000001000Reading spends4361000001000Writing spends6306910000010000Reading spends470910000010000Writing spends86477100000100000Reading spends64116100000100000Writing spends679291000001000000Reading spends3707891000001000000Writing spends76862610000001Reading spends210000001Writing spends850479100000010Reading spends12100000010Writing spends8579801000000100Reading spends841000000100Writing spends85408010000001000Reading spends89910000001000Writing spends856615100000010000Reading spends9960100000010000Writing spends8714671000000100000Reading spends1110291000000100000Writing spends85578210000001000000Reading spends81167010000001000000unordered_mapoperator#include <iostream>#include <cstdlib>#include <ctime>#include <tr1/unordered_map>using namespace std;using namespace tr1;int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){unordered_map<int, int> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M[rand()] = rand();cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M[rand()];cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2211Reading spends311Writing spends1110Reading spends2110Writing spends11100Reading spends151100Writing spends211000Reading spends9811000Writing spends2110000Reading spends973110000Writing spends21100000Reading spends189051100000Writing spends711000000Reading spends30492811000000Writing spends6101Reading spends0101Writing spends11010Reading spends21010Writing spends110100Reading spends21155810100Writing spends2101000Reading spends83101000Writing spends11010000Reading spends8161010000Writing spends210100000Reading spends1877510100000Writing spends9101000000Reading spends331476101000000Writing spends181001Reading spends11001Writing spends1010010Reading spends210010Writing spends9100100Reading spends10100100Writing spends101001000Reading spends841001000Writing spends2110010000Reading spends85610010000Writing spends16100100000Reading spends19406100100000Writing spends201001000000Reading spends3447531001000000Writing spends9310001Reading spends110001Writing spends98100010Reading spends1100010Writing spends951000100Reading spends51000100Writing spends9410001000Reading spends8110001000Writing spends106100010000Reading spends749100010000Writing spends971000100000Reading spends209811000100000Writing spends11010001000000Reading spends33014910001000000Writing spends858100001Reading spends1100001Writing spends8581000010Reading spends11000010Writing spends83710000100Reading spends710000100Writing spends841100001000Reading spends59100001000Writing spends8501000010000Reading spends9501000010000Writing spends84910000100000Reading spends2748010000100000Writing spends919100001000000Reading spends338245100001000000Writing spends337551000001Reading spends11000001Writing spends2954610000010Reading spends310000010Writing spends31192100000100Reading spends97100000100Writing spends301261000001000Reading spends2161000001000Writing spends3719310000010000Reading spends199610000010000Writing spends32065100000100000Reading spends39717100000100000Writing spends175201000001000000Reading spends4737551000001000000Writing spends48073310000001Reading spends210000001Writing spends345884100000010Reading spends44100000010Writing spends2842691000000100Reading spends241000000100Writing spends28384410000001000Reading spends22310000001000Writing spends278945100000010000Reading spends2068100000010000Writing spends2801581000000100000Reading spends1899371000000100000Writing spends28447010000001000000Reading spends37620810000001000000insert & find#include <iostream>#include <cstdlib>#include <ctime>#include <tr1/unordered_map>using namespace std;using namespace tr1;int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){unordered_map<int, int> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M.insert(make_pair(rand(), rand()));cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M.find(rand());cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2411Reading spends111Writing spends1110Reading spends1110Writing spends11100Reading spends21100Writing spends111000Reading spends1811000Writing spends1110000Reading spends174110000Writing spends11100000Reading spends17201100000Writing spends111000000Reading spends1716011000000Writing spends2101Reading spends1101Writing spends11010Reading spends11010Writing spends110100Reading spends410100Writing spends1101000Reading spends25101000Writing spends11010000Reading spends2381010000Writing spends110100000Reading spends236110100000Writing spends1101000000Reading spends23766101000000Writing spends181001Reading spends61001Writing spends1210010Reading spends410010Writing spends13100100Reading spends13100100Writing spends171001000Reading spends451001000Writing spends1410010000Reading spends25110010000Writing spends12100100000Reading spends2390100100000Writing spends121001000000Reading spends242861001000000Writing spends12610001Reading spends110001Writing spends98100010Reading spends1100010Writing spends931000100Reading spends31000100Writing spends10110001000Reading spends6110001000Writing spends104100010000Reading spends259100010000Writing spends971000100000Reading spends24921000100000Writing spends9610001000000Reading spends2550710001000000Writing spends1587100001Reading spends1100001Writing spends10131000010Reading spends11000010Writing spends82310000100Reading spends810000100Writing spends840100001000Reading spends54100001000Writing spends11601000010000Reading spends6771000010000Writing spends81310000100000Reading spends496810000100000Writing spends808100001000000Reading spends38649100001000000Writing spends287901000001Reading spends111000001Writing spends4530010000010Reading spends510000010Writing spends34463100000100Reading spends14100000100Writing spends353881000001000Reading spends1131000001000Writing spends3276710000010000Reading spends267710000010000Writing spends31524100000100000Reading spends13741100000100000Writing spends334731000001000000Reading spends1005861000001000000Writing spends30096210000001Reading spends110000001Writing spends442759100000010Reading spends2100000010Writing spends2708301000000100Reading spends101000000100Writing spends27002910000001000Reading spends12410000001000Writing spends268652100000010000Reading spends1192100000010000Writing spends2694451000000100000Reading spends127171000000100000Writing spends26751510000001000000Reading spends11849510000001000000Btye 32map#include <iostream>#include <cstdlib>#include <ctime>#include <map>using namespace std;inline __uint128_t rand128(){return rand() | ((__uint128_t)rand() << 32) | ((__uint128_t)rand() << 64) | ((__uint128_t)rand() << 96);}int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){map<pair<__uint128_t, __uint128_t>, int> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M.insert(make_pair(make_pair(rand128(), rand128()), rand()));cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M.find(make_pair(rand128(), rand128()));cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2411Reading spends011Writing spends1110Reading spends2110Writing spends11100Reading spends91100Writing spends111000Reading spends7011000Writing spends1110000Reading spends693110000Writing spends11100000Reading spends70611100000Writing spends211000000Reading spends7016611000000Writing spends4101Reading spends1101Writing spends31010Reading spends21010Writing spends110100Reading spends910100Writing spends1101000Reading spends83101000Writing spends21010000Reading spends8021010000Writing spends210100000Reading spends793610100000Writing spends3101000000Reading spends81096101000000Writing spends261001Reading spends21001Writing spends1810010Reading spends310010Writing spends18100100Reading spends13100100Writing spends181001000Reading spends1031001000Writing spends1710010000Reading spends99610010000Writing spends20100100000Reading spends9949100100000Writing spends191001000000Reading spends1003971001000000Writing spends22610001Reading spends110001Writing spends166100010Reading spends3100010Writing spends1641000100Reading spends151000100Writing spends16410001000Reading spends13310001000Writing spends167100010000Reading spends1278100010000Writing spends1681000100000Reading spends128951000100000Writing spends17410001000000Reading spends12727310001000000Writing spends2917100001Reading spends2100001Writing spends27301000010Reading spends41000010Writing spends334410000100Reading spends3610000100Writing spends5555100001000Reading spends670100001000Writing spends43001000010000Reading spends40641000010000Writing spends456910000100000Reading spends3597210000100000Writing spends3696100001000000Reading spends235334100001000000Writing spends802131000001Reading spends11000001Writing spends7597510000010Reading spends710000010Writing spends72787100000100Reading spends61100000100Writing spends727271000001000Reading spends6201000001000Writing spends7817510000010000Reading spends661810000010000Writing spends85278100000100000Reading spends74804100000100000Writing spends699281000001000000Reading spends5418581000001000000Writing spends93703910000001Reading spends210000001Writing spends996383100000010Reading spends12100000010Writing spends9976651000000100Reading spends1161000000100Writing spends100140510000001000Reading spends111510000001000Writing spends994444100000010000Reading spends11241100000010000Writing spends10093231000000100000Reading spends1261251000000100000Writing spends99841010000001000000Reading spends100243910000001000000unordered_map#include <iostream>#include <cstdlib>#include <ctime>#include <functional>#include <tr1/unordered_map>using namespace std;using namespace tr1;struct hashfunc{inline size_t operator()(const pair<__uint128_t, __uint128_t> &i) const{return tr1::hash<long long>()((long long)i.first) ^ tr1::hash<long long>()((long long)(i.first >> 64)) ^ tr1::hash<long long>()((long long)i.second) ^ tr1::hash<long long>()((long long)(i.second >> 64));}};inline __uint128_t rand128(){return rand() | ((__uint128_t)rand() << 32) | ((__uint128_t)rand() << 64) | ((__uint128_t)rand() << 96);}int main(){int start = 0;for (int i = 1; i <= 10000; i++)rand();for (int n = 1; n <= 1e6; n *= 10)for (int m = 1; m <= 1e6; m *= 10){unordered_map<pair<__uint128_t, __uint128_t>, int, hashfunc> M;srand(233);start = clock();for (int i = 1; i <= n; i++)M.insert(make_pair(make_pair(rand128(), rand128()), rand()));cout << "|Writing spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;start = clock();int temp;for (int i = 1; i <= m; i++)M.find(make_pair(rand128(), rand128()));cout << "|Reading spends |" << clock() - start << '|' << n << '|' << m << '|' << endl;}return 0;}项目耗时(微秒)写入次数读取次数Writing spends2111Reading spends211Writing spends1110Reading spends1110Writing spends11100Reading spends91100Writing spends111000Reading spends7611000Writing spends1110000Reading spends744110000Writing spends11100000Reading spends74661100000Writing spends211000000Reading spends7445311000000Writing spends3101Reading spends0101Writing spends21010Reading spends21010Writing spends210100Reading spends910100Writing spends2101000Reading spends85101000Writing spends21010000Reading spends8361010000Writing spends110100000Reading spends837010100000Writing spends2101000000Reading spends84176101000000Writing spends271001Reading spends11001Writing spends1710010Reading spends210010Writing spends15100100Reading spends9100100Writing spends141001000Reading spends831001000Writing spends1410010000Reading spends82510010000Writing spends15100100000Reading spends8127100100000Writing spends201001000000Reading spends819371001000000Writing spends21110001Reading spends110001Writing spends164100010Reading spends2100010Writing spends1431000100Reading spends91000100Writing spends16010001000Reading spends8410001000Writing spends144100010000Reading spends839100010000Writing spends1611000100000Reading spends83441000100000Writing spends16110001000000Reading spends8451810001000000Writing spends2609100001Reading spends1100001Writing spends23411000010Reading spends81000010Writing spends195910000100Reading spends1810000100Writing spends1548100001000Reading spends193100001000Writing spends21391000010000Reading spends17161000010000Writing spends192910000100000Reading spends1439110000100000Writing spends1573100001000000Reading spends128671100001000000Writing spends379111000001Reading spends11000001Writing spends6404610000010Reading spends310000010Writing spends29753100000100Reading spends18100000100Writing spends245351000001000Reading spends2111000001000Writing spends3445810000010000Reading spends198210000010000Writing spends41840100000100000Reading spends30702100000100000Writing spends448581000001000000Reading spends1953891000001000000Writing spends42681410000001Reading spends210000001Writing spends637874100000010Reading spends3100000010Writing spends4050231000000100Reading spends281000000100Writing spends38891010000001000Reading spends30110000001000Writing spends402672100000010000Reading spends2515100000010000Writing spends3939681000000100000Reading spends295901000000100000Writing spends39540310000001000000Reading spends25079510000001000000