找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4962|回复: 6

测试map与vector的查询效率边界

[复制链接]
发表于 2014-7-17 10:07:36 | 显示全部楼层 |阅读模式
今天由于需要,在这里做了一段测试代码。
测试vector和map的效能边界在哪里。
代码如下:
  1. // STLTest.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <map>
  5. #include <vector>
  6. #include <time.h>
  7. using namespace std;
  8. int GetRandom(int nMinNumber, int nMaxNumber)
  9. {
  10.         return nMinNumber + (int)rand()%(nMaxNumber - nMinNumber);
  11. }
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14.         typedef vector<int> vecData;
  15.         typedef map<int, int> mapData;
  16.         vecData m_vecData;
  17.         mapData m_mapData;
  18.         for(int i = 0; i < 10000; i++)
  19.         {
  20.                 m_vecData.push_back(i);
  21.                 m_mapData.insert(mapData::value_type(i, i));
  22.         }
  23.         srand((unsigned)time(NULL));
  24.         int nBase = 10;
  25.         for(int k = 0; k < 5; k++)
  26.         {
  27.                 nBase = nBase * 10;
  28.                 printf_s("**************(%d)*************\n", nBase);
  29.                 //计算vector统计成本
  30.                 clock_t ckStart;
  31.                 clock_t ckEnd;
  32.                 ckStart = clock();
  33.                 //随机找100万次查询
  34.                 for(int i = 0; i < nBase; i++)
  35.                 {
  36.                         int nKey = GetRandom(0, 9999);
  37.                         for(int j = 0; j < 10000; j++)
  38.                         {
  39.                                 if(m_vecData[j] == nKey)
  40.                                 {
  41.                                         break;
  42.                                 }
  43.                         }
  44.                 }
  45.                 ckEnd = clock();
  46.                 double ttime =  (double)(ckEnd - ckStart) / CLOCKS_PER_SEC;
  47.                 printf_s("[vector]nBase = %d, timecost=%lf.\n", nBase, ttime);
  48.                 //计算map统计成本
  49.                 ckStart = clock();
  50.                 //随机找100万次查询
  51.                 for(int i = 0; i < 1000000; i++)
  52.                 {
  53.                         int nKey = GetRandom(0, 9999);
  54.                         mapData::iterator f = m_mapData.find(nKey);
  55.                         if(f == m_mapData.end())
  56.                         {
  57.                                 printf_s("[map]No Find(%d).\n", nKey);
  58.                         }
  59.                 }
  60.                 ckEnd = clock();
  61.                 ttime =  (double)(ckEnd - ckStart) / CLOCKS_PER_SEC;
  62.                 printf_s("[map]nBase=%d, timecost=%lf.\n", nBase, ttime);
  63.                 printf_s("***************************\n");
  64.         }
  65.         getchar();
  66.         return 0;
  67. }
复制代码
输出如下:
**************(100)*************
[vector]nBase = 100, timecost=0.001000.
[map]nBase=100, timecost=0.160000.
***************************
**************(1000)*************
[vector]nBase = 1000, timecost=0.008000.
[map]nBase=1000, timecost=0.157000.
***************************
**************(10000)*************
[vector]nBase = 10000, timecost=0.050000.
[map]nBase=10000, timecost=0.164000.
***************************
**************(100000)*************
[vector]nBase = 100000, timecost=0.482000.
[map]nBase=100000, timecost=0.144000.
***************************
**************(1000000)*************
[vector]nBase = 1000000, timecost=4.485000.
[map]nBase=1000000, timecost=0.149000.
***************************

看来边界值在10000左右,知道这个边界,就知道怎么更好的利用容器了。


发表于 2014-7-18 10:55:31 | 显示全部楼层
你这个测试是有问题的啊。
stl的设计,是遵循最优原则的。vector本质上是数组,所以查找只能遍历。map是树,还有hash_map,检索采用的算法是不同的。
发表于 2014-7-21 08:57:40 | 显示全部楼层
有的时候还取决于你的key的比较的复杂度,比如说你用string来做key试试?估计边界就只有几百了。
 楼主| 发表于 2014-7-21 15:54:15 | 显示全部楼层
我知道一个是数组,一个是hash命中。
我找的是,什么条件下用vector较好,什么条件下用map较好。
算法不通带来的差异也会不同。看需求了。

点评

map是红黑树 逻辑平衡二叉树  详情 回复 发表于 2014-8-25 22:12
发表于 2014-8-25 22:12:47 | 显示全部楼层
freeeyes 发表于 2014-7-21 15:54
我知道一个是数组,一个是hash命中。
我找的是,什么条件下用vector较好,什么条件下用map较好。
算法不通 ...

map是红黑树   逻辑平衡二叉树
发表于 2014-8-25 22:32:05 | 显示全部楼层
你这个是 遍历*1次operator ==() 和  折半*2次operator <()   之间的性能比较
map的时间复杂度是   n根号2 *2次<比较      vector 是 n*1次==比较   
当 (n根号2 *2)  == (n)  是极值
明显当n越大   左边数据(时间复杂度)会越小
 楼主| 发表于 2014-8-26 14:58:00 | 显示全部楼层
呵呵,恩。说道点上了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 02:29 , Processed in 0.018239 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表