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插入时间最短,遍历时间最长
CArray CList CMap 插入与遍历效率对比相关推荐
- MyBatis插入大量数据效率对比:foreach、SqlSession、sql三种方式批量插入
用mybatis插入数据执行效率对比,对比三种方式(测试数据库为MySQL), 使用 SqlSessionFactory,每一批数据执行一次提交 使用mybatis-plus框架的insert方法,f ...
- 数组常见的遍历循环方法、数组的循环遍历的效率对比
1 遍历数组的方法 1-1.for / while 最普通的循环 效率最高 兼容ie6 tips:for循环更适用于循环的开始和结束已知,循环次数固定的场合:while循环更适合于条件不确定的场合 1 ...
- php遍历数组哪个效率高,PHP遍历数组的三种方法及效率对比分析
PHP遍历数组的三种方法及效率对比分析 发布于 2015-03-04 21:55:27 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...
- Java遍历Map效率对比
Java遍历Map效率对比 Java 中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使 ...
- php遍历数组哪个效率高,PHP遍历数组的三种方法及效率对比分析_php技巧
本文实例分析了PHP遍历数组的三种方法及效率对比.分享给大家供大家参考.具体分析如下: 今天有个朋友问我一个问题php遍历数组的方法,告诉她了几个.顺便写个文章总结下,如果总结不全还请朋友们指出 第一 ...
- php 遍历 效率高,PHP遍历数组的三种方法及效率对比分析
这篇文章主要介绍了PHP遍历数组的三种方法及效率对比,实例分析了foreach.while与for三种遍历数组的方法与相关的效率比对,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例分析了PHP遍 ...
- php高效遍历,PHP 遍历数组的三种方法及效率对比分析
PHP 遍历数组的三种方法及效率对比分析 本文实例分析了 PHP 遍历数组的三种方法及效率对比分享给大家供大家参考具体分析如下: 今天有个朋友问我一个问题 php 遍历数组的方法, 告诉她了几个顺便写 ...
- Map遍历的四种方法效率对比
最近在面试的时候笔试碰到一道关于map的题,请手写出map遍历效率最高的方法. 关于map遍历的方式相信大家都知道,但是各个方法的一个效率高低可能有些人平常没有注意,所以在这做了一个简单的测试. pu ...
- Java-多线程-Future、FutureTask、CompletionService、CompletableFuture解决多线程并发中归集问题的效率对比
转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: [小家Java]Future.FutureTask.CompletionService.CompletableFut ...
最新文章
- qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
- javascript的location/history
- Oracle 11g Release 1 (11.1) 查询优化器的访问路径
- VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误
- 全国地铁城市数据分析(python实现)
- 使用windowManager实现音乐播放器(悬浮框)效果
- tar 压缩与解压缩打包命令
- 程序员修神之路--缓存架构不够好,系统容易瘫痪
- 基于C#.NET的高端智能化网络爬虫
- spring boot 初步学习
- Hibernate -- hibernate.cfg.xml 核心配置文件
- springboot应用启动原理(一) 将启动脚本嵌入jar
- Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'...
- 机器学习书籍资料推荐
- Android自动测试之Monkey工具2
- [原创]jQuery的this和$(this)
- Vb.net遍历一个窗口中的所有某类对象 (窗体中的控件) 的方法
- Matlab 2010b再次打开安装问题
- Visual Studio 插件番茄助手2个优秀的特性
- 腾讯地图手把手教你实现微信小程序路线规划