在日常中我们常常遇到一些代码比较耗时。这个时候经常会遇到一些优化代码的工作。这里我就说一下我坐优化过程中的经验。(本人小白,不喜勿喷)
耗时操作大致都是在处理一些数据量比较大的操作,或者在查询一些数据方面的问题。
1.首先先查看一下数据范围。能定为范围的尽量不要做一些全表查询。比如我只用IsEnable=1的数据。但是你那里非要查全部的。
2.查询操作时最好根据索引查询,定义好索引。(请自行查看索引的相关规则,避免没有命中索引,导致查询变慢)
3.缓存可以解决一部分数据问题
4.多线程也是优化的一种高效方式。
下面我说一下我在实际中遇到的问题:
先描述一下实际场景。最近在我优化的一个代码情景中:数据是在内存中操作的,
但是数据需要大量的循环,在循环的过程中需要运用大量的计算逻辑。并且在循环当中,还需要对被循环的对象做一些值的改变。
当时我第一个想到的是多线程,直接Task.Run。不过后来发现这样会导致同时对一个集合做增删改的操作,这样会报错。所有后来用了BlockingCollection 。
BlockingCollection 是一个线程安全集合类。可提供以下功能:
实现制造者-使用者模式。
通过多线程并发添加和获取项。
可选最大容量。
集合为空或已满时通过插入和移除操作进行阻塞。
插入和移除操作不发生阻塞,或在指定时间内发生阻塞。
官方文档:https://docs.microsoft.com/zh-cn/dotnet/standard/collections/thread-safe/blockingcollection-overview
所以我最后的解决办法是分批开启多线程
Task task = new Task(() =>{
for(int i=0;i<index.count;i++){
new Task(()=>{
NewMethod();//耗时的循环方法
},TaskCreationOptions.AttachedToParent).Start();
}
});
task.Start();
task.Wait();//等待所以线程都执行完,进行下一步操作。
以上是我这个方案优化代码的大致思路,留给大家借鉴一下。