前言:程序中经常用到不定量数组,选择上可以使用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插入时间最短,遍历时间最长

最新文章

  1. input标签中button在iPhone中圆角的问题
  2. 如何在redhat下安装WineQQ
  3. 将Excel中数据导入数据库(二)
  4. [React] Higher Order Components (replaces Mixins)
  5. 学习日记_SSH框架web.xml配置文件篇
  6. Linux下安装Oracle 10g(redhat 4)
  7. 免费自学Cocos2d-x3.0final2014原创视频教程(56集)(适用于Cocos2d-x3.1 Cocos2d-x3.2版本号全)
  8. Net FLow Template
  9. wordpress常见的问题
  10. POJ 1637 Sightseeing tour(最大流)
  11. php 异步
  12. hdu_5690_All X(找循环节)
  13. Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)
  14. css中的position(定位)
  15. [翻译] 介绍EF Core
  16. jpa数据库表实体命名规则 Unknown column &#39;user0_.create_time&#39; in &#39;field list&#39;
  17. SpringBoot条件注解@Conditional
  18. 什么是mime类型
  19. opencv画出轮廓外接矩形
  20. vue2.0在table中实现全选和反选

热门文章

  1. Tars-Java客户端源码分析
  2. 【js】Leetcode每日一题-解码异或后数组
  3. 使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)
  4. Mac终端使用tree命令查看目录结构
  5. MarkDown写ppt
  6. 在Visual Studio 中使用git——文件管理-上(四)
  7. Linux Limit相关内容设置大全(值得收藏)
  8. 面试侃集合 | ArrayBlockingQueue篇
  9. 从执行上下文(ES3,ES5)的角度来理解&quot;闭包&quot;
  10. C++ primer plus读书笔记——第4章 复合类型