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

CArray CList CMap 插入与遍历效率对比的更多相关文章

  1. MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比

    MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比一.在mybatis中ExecutorType的使用1.Mybatis内置的ExecutorType有3种,默认的是s ...

  2. IOS各种集合遍历效率对比

    前言: 对于ios项目开发中总会遇见各种集合遍历,出于对各种遍历效率的好奇心,所以准备写个测试程序测试一下 首先:先声明一个NSMutableArray,测试数据量分别是1000条,10000条,10 ...

  3. ArrayList哪种遍历效率最好,你真的弄明白了吗?

    ArrayList简介 声明:以下内容都是基于jdk1.8的 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了 ...

  4. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  5. sqlite3树形结构遍历效率对照測试

    sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...

  6. List集合去重方式及效率对比

    List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一 ...

  7. Map遍历效率比较

    1.由来 上次博客提到了Map的四种遍历方法,其中有的只是获取了key值或者是value值,但我们应该在什么时刻选择什么样的遍历方式呢,必须通过实践的比较才能看到效率. 也看了很多文章,大家建议使用e ...

  8. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  9. string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比

    关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...

随机推荐

  1. 2.逆向分析Hello World!程序-上

    先写一个HelloWorld程序(vs2015 / C++) 编译链接生成可执行文件XX.exe,然后用OD[OllyDbg]打开调试: 代码窗口:默认用于显示反汇编代码,还用于各种注释.标签,分析代 ...

  2. c# p/invoke 无法加载指定的dll 找不到指定的模块 解决方法

    写的程序本来开始好好的,不知道怎么突然就出现了以上这个问题,纠结了好久,网上找了各种方法,比如什么嵌入dll,在system32下面放入dll等等,均宣告失败 下面把我的解决方法写出来,以后只要是这个 ...

  3. 简化mapstruct代码: mapstruct-spring-plus

    mapstruct MapStruct 是一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现.MapStruct官网地址: h ...

  4. Python数模笔记-Sklearn(1) 介绍

    1.SKlearn 是什么 Sklearn(全称 SciKit-Learn),是基于 Python 语言的机器学习工具包. Sklearn 主要用Python编写,建立在 Numpy.Scipy.Pa ...

  5. Markdown修改字体颜色

    在写blog时,想高亮某些字,但是发现markdown更改字体颜色不像word里那么方便,于是查了一下,要用一下代码进行更改字体颜色,还可以更改字体大小,还有字体格式 <font 更改语法> ...

  6. java数组 简单了解

    一.关于集合 1.数组,链表和哈希表(散列表)的存储方式 (1)传统的数组结构存储数据会在内存中开辟连续得空间,结合下标从而使得可以快速访问数据,但是删除和添加数据就很浪费资源 (2)链表不需要开辟连 ...

  7. 脱壳入门----脱ASPack壳保护的DLL

    前言 结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析. 脱壳详细过程 寻找程序的OEP 先将目标DLL拖入OD,来到壳的入口处. 然后利用堆栈平衡原理在push ...

  8. 问渠那得清如许?为有源头活水来——对【近取Key】产品进行的深度测评与解析

    在 Build To Show 的场景中,大家各显身手,用各种办法展现技术,的确很难在单一的维度上确定谁赢谁输.但是,在 Build To Win 的场景中,往往市场就是那么一块, 竞争对手占了 70 ...

  9. rabbitmq介绍以及初步使用

    什么是MQ? ​ MQ(Message Queue):翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断地从队列中获取消息.因为消息的生产和消费都是异步的,而且只 ...

  10. .Net Core·寄托于IIS的REST服务405的问题

    阅文时长 | 0.48分钟 字数统计 | 828.8字符 主要内容 | 1.引言&背景 2.声明与参考资料 『.Net Core·寄托于IIS的REST服务405的问题』 编写人 | SCsc ...