记一次list集合优化
已知某个列表List1有2000条数据,但是因为这个列表的某个字段要从另一个表查询,所以根据一个关联的查询条件查出来的另一个List2有将近75000条数据,然后需要先循环第一个List1,然后循环里面取寻找List2里面符合条件的,因为有某种业务逻辑,所以无法减少List2的sql查询结果数量,所以到最后导出2000条数据需要十几秒,一般而言,计算机循环2000条数据可能不到1秒钟,所以第一个反应是优化List2的循环。
原来的代码如下,开始使用的是通过Linq来筛选条件,数据少的时候还可以,但是当数据多的时候,相当于循环2000*70000次,效率可想而知:
IList<ProjectSchedulePlanByTaskItem> items = IoCContainer.Get<IProjectSchedulePlanByTaskItemDao>().Select(where)//将近75000条数据
foreach (Task task in taskList)//2000条数据
{
data.TaskProgress = GetCurrentStatus(items.Where(linq查询条件));
datas.Add(data);
}
于是我上网百度了一下,得知将字典集合额效率是要比list效率高的,因为Dictionary<TKey,TValue>类实现为哈希表,ContainsKey() 内部是通过Hash查找实现的,查询的时间复杂度是O(1)。貌似Linq的where也是for循环,数量越多,越慢,所以,当我最初只是把Linq改成for循环的时候只是快了一两秒。但是当我把items改成转为Dictionary的时候,从原来的的导出要十几秒减少到只有2~4秒。
Dictionary<int, List<ProjectSchedulePlanByTaskItem>> keyValueByTask= items.GroupBy(s=>s.TaskId).ToDictionary(s => s.Key,s=>s.ToList());//转为字典集合
foreach (Task task in taskList)
{
TaskProgressData data = new TaskProgressData();
IList<ProjectSchedulePlanByTaskItem> whereList = new List<ProjectSchedulePlanByTaskItem>();
if (keyValueByTask.ContainsKey(task.Id))//查询的时间为O(1),远比list的for循环快
{
List<ProjectSchedulePlanByTaskItem> values = keyValueByTask[task.Id];
whereList = values.Where(s => s.ProjectNumber == task.ProjectNumber).ToList();
}
data.TaskProgress = GetCurrentStatus(whereList);
datas.Add(data);
}
代码很简单,也许很多人都知道,但是很多东西都是从无到有,所以以此记录,加深自己的理解。
记一次list集合优化的更多相关文章
- 【BZOJ4654】【NOI2016】国王饮水记(动态规划,斜率优化)
[BZOJ4654][NOI2016]国王饮水记(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 首先肯定是找性质. 明确一点,比\(h_1\)小的没有任何意义. 所以我们按照\(h\)排序,那么\ ...
- for循环实战性能优化之使用Map集合优化
笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...
- 记一次MYSQL更新优化
引言 今天(August 5, 2015 5:34 PM)在给数据库中一张表的结构做一次调整,添加了几个字段,后面对之前的数据进行刷新,刷新的内容是:对其中的一个已有字段url进行匹配,然后更新新加的 ...
- 记一次动画的优化--requestAnimationFrame、webp
需要写一个类似帧动画的东西,但是每一帧是一张全屏的图,而且量特别大,600都张,而且存在跳帧的问题,只有把速度调的很快还可以看着不跳帧.但是只用谷歌还真正常播放. 其实优化起来两个方面.一个是用req ...
- HDOJ 4508 湫湫系列故事——减肥记I (完全背包带优化)
完全背包的模版题.. 加了一个小优化 n^2的写法 O(V+N)在本题中复杂度较高 不采纳 完全背包问题有一个很简单有效的优化,是这样的:若两件物品i.j满足c[i]<=c[j]且w[i]&g ...
- 记一次 java程序优化
优化原因 环境中部署两个程序: web应用 tomcat 10G(webservice服务端,前端web服务) java应用 5G(webservice客户端,sock ...
- 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。
目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...
- 记一次服务器Tomcat优化经历
公司需要一台测试服务器来做测试用,所以花了几天时间把服务全部部署好,在部署好war包之后,发现Tomcat访问超级慢. 1.进入Tomcat的bin目录下,运行 ./catalina.sh run命令 ...
- 记一次webpack打包优化
未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...
随机推荐
- 在SMT32程序HEX文件中加入固件版本信息
将固件版本信息定义成一个常量存放在程序中,需要的时候可以通过串口等接口查询代码版本信息,另一种,是利用编译器的语法,将固定的信息保存到某地. #define VERINFO_ADDR_BASE (0x ...
- 【基础推导】MPC控制器及其车辆模型详细推导 (附代码链接及详细推导说明)
0. 参考与前言 Python 代码:github AtsushiSakai/PythonRobotics C++ 代码:github jchengai/gpir/mpc_controller 相关参 ...
- 基于python3 flet库的证书查看工具
前言 基于python3 flet库实现了证书信息的提取,留作自用,如有错误欢迎指正. 正文 程序架构: 主程序 main.py 证书解析程序 certHandle.py 运行 python main ...
- c语言之位段
百度百科链接 示例: 1 struct CHAR 2 { 3 unsigned int ch : 8; //8位 4 unsigned int font : 6; //6位 5 unsigned in ...
- Java 散列表HashTable
什么是散列表hash table和使用场景 什么是散列表 散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来 ...
- WPF单行TextBox自动滚动至末尾
根据光标位置自动滚动 textBox.CaretIndex = textBox.SelectionStart; var rect = textBox.GetRectFromCharacterIndex ...
- 史上最详细的Composer安装tp5教程
Composer安装tp5教程1.下载composer先介绍几个网站Composer官网https://getcomposer.org/ Composer中文网http://www.phpcompos ...
- SSH指定用户登录与限制
环境准备 :::info 实验目标:ServerA通过用户ServerB(已发送密钥和指定端口) ::: 主机 IP 身份 ServerA 192.168.10.201 SSH客户端 ServerB ...
- ComfyUI进阶:Comfyroll插件 (四)
ComfyUI进阶:Comfyroll插件 (四) 前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业 ...
- elementui中实现loding实现局部加载,以el-dialog为例
效果 封装loading加载(也可以直接使用,封装为了方便多次调用) 组件定义:loadDiy.js import { Loading } from "element-ui"; e ...