CArray CList CMap 插入与遍历效率对比

前言:程序中经常用到不定量数组,选择上可以使用CArray,CList,CMap,而这三者插入及遍历的效率,未测试过,随着数据量越来越大,需要做程序上的优化,于是比较下三种类型的插入盒遍历的效率。

一、测试环境

购物优惠券 https://m.cqfenfa.com/

 1、测试使用的笔记本的配置。

 

 

  2 系统版本:

 

 

 二、测试数据

   自定义结构体,包含12个float的数据,准备插入1000000个数据

struct LXYDATA
{
float L;
float x;
float y;
float Tc;
float X;
float Y;
float Z;
float u;
float v;
float L1;
float a;
float b;
};

 

三 CArray测试

1 变量定义

   

CArray<LXYDATA,LXYDATA&> arrayData;

 

2 未事先指定元素个数时测试代码

LXYDATA data;
DWORD timeStart;
DWORD timeEnd;
CString strTemp;

data.L = 45.22;
data.x = 45.22;
data.y = 45.22;
data.Tc = 45.22;
data.X = 45.22;
data.Y = 45.22;
data.Z = 45.22;
data.u = 45.22;
data.v = 45.22;
data.L1 = 45.22;
data.a = 45.22;
data.b = 45.22;

timeStart = GetTickCount();
arrayData.RemoveAll();

for (int i = 0; i < 10000000; i ++)
{
arrayData.Add(data);
}
timeEnd = GetTickCount();
strTemp.Format("%d",timeEnd-timeStart);
AfxMessageBox(strTemp);

3 测试时间

  1 未指定大小的情况下,程序跑了935828ms,未出结果,内存一度上升到800+M

 

 

 

 

  2 插入前指定大小 测试时间

    timeStart = GetTickCount();
    arrayData.RemoveAll();
    arrayData.SetSize(10000000,10000000);
    for (int i = 0; i < 10000000; i ++)
    {
        arrayData.Add(data);
    }
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

 

 

3 遍历时间

LXYDATA dataTemp;
    CString strTemp;
    DWORD timeStart,timeEnd;
    timeStart = GetTickCount();
    
    for (int i = 0; i < 1000000; i ++)
    {
        dataTemp = arrayData.GetAt(i);
    }
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

 

 

四 CList测试

1 变量定义

CList<LXYDATA,LXYDATA&> listData;

2 插入代码

LXYDATA data;
    DWORD timeStart;
    DWORD timeEnd;
    CString strTemp;

    data.L = 45.22;
    data.x = 45.22;
    data.y = 45.22;
    data.Tc = 45.22;
    data.X = 45.22;
    data.Y = 45.22;
    data.Z = 45.22;
    data.u = 45.22;
    data.v = 45.22;
    data.L1 = 45.22;
    data.a = 45.22;
    data.b = 45.22;

    timeStart = GetTickCount();
    listData.RemoveAll();
    
    for (int i = 0; i < 10000000; i ++)
    {
        listData.AddTail(data);
    }
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

3 插入时间

 

4 遍历时间

LXYDATA dataTemp;
    CString strTemp;
    DWORD timeStart,timeEnd;
    timeStart = GetTickCount();

// GetAt方式遍历时间过长
//     for (int i = 0; i < 1000000; i ++)
//     {
//         dataTemp = listData.GetAt(listData.FindIndex(i));
//     }

    POSITION pos = listData.GetHeadPosition();
    while(pos != NULL)
    {
        dataTemp = listData.GetNext(pos);
    }
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

 

 

五 CMap时间测试

1 变量定义

CMap<int,int,LXYDATA,LXYDATA> mapData;

2 插入代码

LXYDATA data;
    DWORD timeStart;
    DWORD timeEnd;
    CString strTemp;

    data.L = 45.22;
    data.x = 45.22;
    data.y = 45.22;
    data.Tc = 45.22;
    data.X = 45.22;
    data.Y = 45.22;
    data.Z = 45.22;
    data.u = 45.22;
    data.v = 45.22;
    data.L1 = 45.22;
    data.a = 45.22;
    data.b = 45.22;

    timeStart = GetTickCount();
    mapData.RemoveAll();
    mapData.InitHashTable(1200001);  //一定要指定大小,大小设置实际使用到的1.2倍,且使用奇数
    for (int i = 0; i < 1000000; i ++)
    {
        mapData.SetAt(i,data);
    }
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

3 插入时间

 

 

4 查询时间

LXYDATA dataTemp;
    CString strTemp;
    DWORD timeStart,timeEnd;
    timeStart = GetTickCount();

    POSITION pos = mapData.GetStartPosition();
    int i = 0;
    while(pos != NULL)
    {
        mapData.GetNextAssoc(pos,i,dataTemp);
    }
    
    timeEnd = GetTickCount();
    strTemp.Format("%d",timeEnd-timeStart);
    AfxMessageBox(strTemp);

 

 

 

六 总结

1 不管用哪一种方式,如果数据量较大,都要在使用前指定大小,这个效率是非一般的提升

2 CArray的遍历时间最短,只是相对较短,其他两个也没有太耗时间,可以算是基本持平

3 CMap插入时间最短,遍历时间最长

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值