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插入时间最短,遍历时间最长
CArray CList CMap 插入与遍历效率对比的更多相关文章
- MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比
MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比一.在mybatis中ExecutorType的使用1.Mybatis内置的ExecutorType有3种,默认的是s ...
- IOS各种集合遍历效率对比
前言: 对于ios项目开发中总会遇见各种集合遍历,出于对各种遍历效率的好奇心,所以准备写个测试程序测试一下 首先:先声明一个NSMutableArray,测试数据量分别是1000条,10000条,10 ...
- ArrayList哪种遍历效率最好,你真的弄明白了吗?
ArrayList简介 声明:以下内容都是基于jdk1.8的 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了 ...
- 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 ...
- sqlite3树形结构遍历效率对照測试
sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...
- List集合去重方式及效率对比
List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一 ...
- Map遍历效率比较
1.由来 上次博客提到了Map的四种遍历方法,其中有的只是获取了key值或者是value值,但我们应该在什么时刻选择什么样的遍历方式呢,必须通过实践的比较才能看到效率. 也看了很多文章,大家建议使用e ...
- 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比
关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...
随机推荐
- windows-API劫持(API-HOOK)
API Hook ApiHook又叫做API劫持,也就是如果A程序调用了B.cll里面的C函数,我们可以做到当A调用C函数执行的时候,直接执行我们自己事先准备好的函数,之后我们在执行真正的C,当然我们 ...
- uni-app&H5&Android混合开发二 || 使用Android Studio打包应用APK
前言: 在上一章节我们已经讲了如何uni-app离线打包Android平台教程,这一章就该来讲讲如何使用Android Studio打包应用APK提供给Android手机安装使用了. 第一步.首先打开 ...
- JavaScript 中正则匹配时结果不一致的问题
创建示例项目 考察如下场景,我们有个输入框组件,输入时同时进行校验. interface IInputProps { label: string; } function Input({ label } ...
- 手写Spring MVC框架(一) 实现简易版mvc框架
前言 前面几篇文章中,我们讲解了Spring MVC执⾏的⼤致原理及关键组件的源码解析,今天,我们来模仿它⼿写⾃⼰的mvc框架. 先梳理一下需要实现的功能点: tomcat加载配置文件web.xml: ...
- MindSpore保存与加载模型
技术背景 近几年在机器学习和传统搜索算法的结合中,逐渐发展出了一种Search To Optimization的思维,旨在通过构造一个特定的机器学习模型,来替代传统算法中的搜索过程,进而加速经典图论等 ...
- Django(21)migrate报错的解决方案
前言 在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本.映射到数据库中.创建新的表或者修改表的结构. 问题1:migrate怎么判断哪 ...
- 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业
初窥软件工程 2020BUAA软件工程\(\cdot\)个人博客作业 目录 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业 一.作业要求简介 二.正文 (一) 快速看完整部教材,列出 ...
- Spring Cloud Alibaba Nacos Config 实战
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spring Cloud Alibaba Nacos Config,您可 ...
- -bash: ll: 未找到命令
第一步将alias ll='ls -l'添加到/etc/profile # head /etc/profile# /etc/profilealias ll='ls -l'# System wide e ...
- CentOS7中下载RPM及其所有的依赖包
CentOS7中下载RPM及其所有的依赖包 转载beeworkshop 最后发布于2019-09-28 07:43:40 阅读数 1096 收藏 展开 利用 Downloadonly 插件下载 RP ...