已知某个列表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集合优化的更多相关文章

  1. 【BZOJ4654】【NOI2016】国王饮水记(动态规划,斜率优化)

    [BZOJ4654][NOI2016]国王饮水记(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 首先肯定是找性质. 明确一点,比\(h_1\)小的没有任何意义. 所以我们按照\(h\)排序,那么\ ...

  2. for循环实战性能优化之使用Map集合优化

           笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...

  3. 记一次MYSQL更新优化

    引言 今天(August 5, 2015 5:34 PM)在给数据库中一张表的结构做一次调整,添加了几个字段,后面对之前的数据进行刷新,刷新的内容是:对其中的一个已有字段url进行匹配,然后更新新加的 ...

  4. 记一次动画的优化--requestAnimationFrame、webp

    需要写一个类似帧动画的东西,但是每一帧是一张全屏的图,而且量特别大,600都张,而且存在跳帧的问题,只有把速度调的很快还可以看着不跳帧.但是只用谷歌还真正常播放. 其实优化起来两个方面.一个是用req ...

  5. HDOJ 4508 湫湫系列故事——减肥记I (完全背包带优化)

    完全背包的模版题.. 加了一个小优化  n^2的写法 O(V+N)在本题中复杂度较高 不采纳 完全背包问题有一个很简单有效的优化,是这样的:若两件物品i.j满足c[i]<=c[j]且w[i]&g ...

  6. 记一次 java程序优化

    优化原因 环境中部署两个程序: web应用 tomcat   10G(webservice服务端,前端web服务) java应用               5G(webservice客户端,sock ...

  7. 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。

    目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...

  8. 记一次服务器Tomcat优化经历

    公司需要一台测试服务器来做测试用,所以花了几天时间把服务全部部署好,在部署好war包之后,发现Tomcat访问超级慢. 1.进入Tomcat的bin目录下,运行 ./catalina.sh run命令 ...

  9. 记一次webpack打包优化

    未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...

  10. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...

随机推荐

  1. python_8 拆包、内置函数和高阶函数

    一.查缺补漏 1. \t 子表符,用于对其二.拆包 1. 拆包:顾名思义就是将可迭代的对象如元组,列表,字符串,集合,字典,拆分出相对应的元素 2. 形式:拆包一般分两种方式,一种是以变量的方式来接收 ...

  2. 【ClickHouse问题】更新表字段类型为Nullable(Int32)的列值,最终结果都是固定一个值:93147008???

    问题描述: clickhouse更新表数据.更新的列数据类型是Nullable(Int32),不管更新为什么数值,最后查询的结果都是一个固定值:93147008 问题复现: 1:建一张测试表 CREA ...

  3. 【workerman】uniapp+thinkPHP5使用GatewayWorker实现实时通讯

    前言 之前公司需要一个内部的通讯软件,就叫我做一个.通讯软件嘛,就离不开通讯了,然后我就想到了长连接.这里本人用的是GatewayWorker框架. 什么是GatewayWorker框架? Gatew ...

  4. java 类的执行顺序

    java代码 package net.cybclass.sp; public class Test01 { public static void main(String[] args) { new c ...

  5. supervisor.conf部署及维护

    启动服务 supervisord -c /etc/supervisord.conf 启动服务 supervisorctl start 关闭服务 supervisorctl stop

  6. 题解:P10723 [GESP202406 七级] 黑白翻转

    背景 汗流浃背了. 分析 容易想到一个显然的思路:以任意节点为根,开始遍历.如果一个节点的子树里面有黑点,那么它必须保留,否则如果它是白点,则可以删去. 但这个方法很容易举出反例: 在这颗树中,如果以 ...

  7. 2023 CSP 游记

    目录 \(\text{CSP-J}\) 游记 \(\text{CSP-S}\) 游记 \(\text{CSP-J}\) 游记 省流:\(\text{B}\) 题挂了 \(100\text{ pts}\ ...

  8. git常用代码

    //当前文件夹删除的文件恢复git reset Head .// 查看所有分支git branch// 查看本地分支 对应的远程分支git branch -vv//git branch -vv//创建 ...

  9. 用IO多路复用实现 nginx 静态资源代理(C/Java/Golang)

    用IO多路复用实现 nginx 静态资源代理(C/Java/Golang) 效果展示 代理 HTML 代理图片 注意, 静态资源代理基于 HTTP, 可以了解上一篇文章: 几十行代码使用TCP简单实现 ...

  10. Linux 有趣命令

    代码雨 1.上传软件包 Linux 获取 wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix-1.2a ...