C++有序map和無序unordered_map效能測試對比
阿新 • • 發佈:2018-12-10
概述
簡單對比map和unordered_map的效能。 map內部是紅黑樹,在插入元素時會自動排序,而無序容器unordered_map內部是散列表,通過雜湊而不是排序來快速操作元素,使得效率更高。當你不需要排序時選擇unordered_map的效率更高。
測試範例
測試程式碼
#include <iostream>
#include <string>
#include <sys/time.h>
#include <map>
#include <unordered_map>
using namespace std;
const int kRunTime1 = 1000*1000; // 迴圈次數
const int kRunTime2 = 1000*10000;
int main()
{
std::map<int, int> mp;
std::unordered_map<int, int> unordermp;
timeval st, et;
cout << "插入個數 = " << kRunTime1 << endl;
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime1; ++i)
{
mp.insert(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "1 有序map測試時間insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime1; ++i)
{
unordermp.insert(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "1 無序map測試時間insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
cout << "\n插入個數 = " << kRunTime2 << endl;
mp.clear();
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime2; ++i)
{
mp.insert(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "2 有序map測試時間insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
mp.clear();
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime2; ++i)
{
mp.emplace(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "2 有序map測試時間emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
unordermp.clear();
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime2; ++i)
{
unordermp.insert(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "2 無序map測試時間insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
unordermp.clear();
gettimeofday(&st, NULL);
for(int i = 0; i < kRunTime2; ++i)
{
unordermp.emplace(make_pair(i, i));
}
gettimeofday(&et, NULL);
cout << "2 無序map測試時間emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;
return 0;
}
測試結果
第一次執行
插入個數 = 1000000
1 有序map測試時間insert time:922ms
1 無序map測試時間insert time:360ms
插入個數 = 10000000
2 有序map測試時間insert time:10451ms
2 有序map測試時間emplace time:10531ms
2 無序map測試時間insert time:3854ms
2 無序map測試時間emplace time:2956ms
第二次執行
插入個數 = 1000000
1 有序map測試時間insert time:918ms
1 無序map測試時間insert time:344ms
插入個數 = 10000000
2 有序map測試時間insert time:10470ms
2 有序map測試時間emplace time:10597ms
2 無序map測試時間insert time:3826ms
2 無序map測試時間emplace time:2932ms
第三次執行
插入個數 = 1000000
1 有序map測試時間insert time:909ms
1 無序map測試時間insert time:376ms
插入個數 = 10000000
2 有序map測試時間insert time:10395ms
2 有序map測試時間emplace time:10505ms
2 無序map測試時間insert time:4015ms
2 無序map測試時間emplace time:3102ms
測試結果
- unordered_map的插入速度明顯優於map
- 對於map,emplace的介面相對於insert 沒有提升,甚至效率還差一點
- 對於unordered_map,emplace的介面相對於insert 有30%左右的提升