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


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

    一、测试环境

     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插入时间最短,遍历时间最长

  • 相关阅读:
    shop--11.前端展示系统--店铺列表(后端)
    shop--11.前端展示系统--首页展示(前端)
    shop--11.前端展示系统--首页展示(后端)
    shop--10.商品--解除商品与某商品类别的关联的实现
    shop--10.商品--商品管理(前端)
    shop--10.商品--商品管理(后端)--dao层--Service层--Controller层
    shop--10.商品--商品编辑(前端)及调试注意
    shop--10.商品--商品编辑(后端)--Controller层
    shop--10.商品--商品编辑(后端)--Service层
    shop--10.商品--商品编辑(后端)--dao层
  • 原文地址:https://www.cnblogs.com/fredliu/p/14877803.html
Copyright © 2020-2023  润新知