Linq语句效率低下,慎用(记一次优化)
有一个wpf项目中,需要查询曲线,然后显示,数据间隔时长为10秒,需要显示24小时数据,大概数据量为8k多条,开始的代码是这样写的,没什么其他原因,因为写代码便捷,下面只贴出关键的一行代码:
RealTimeData item = realTimeDataList.Where(m => m.createtime > nowDateTime.AddSeconds((-i - 1) * ConfigInitail.DaqInterval) && m.createtime < nowDateTime.AddSeconds((i - 1) * ConfigInitail.DaqInterval)).OrderByDescending(m => m.createtime).FirstOrDefault();
代码就不解释了,就是查询采集间隔时间内最新一条数据,整个曲线加载需要10秒左右,甚至有时候10秒以上,排除了其他原因,影响执行效率的应该就是在上面这一句;在我的印象里,for循环效率是最高的,查了一些资料很多人也是这个看法,那我改一版试下呗,
代码如下:
private RealTimeData GetRealTimeData(List<RealTimeData> realTimeDataList, DateTime nowDateTime) { for (int i = 0, count = realTimeDataList.Count; i < count; i++) { if (realTimeDataList[i].createtime >= nowDateTime.AddSeconds((-i - 1) * ConfigInitail.DaqInterval) && realTimeDataList[i].createtime < nowDateTime.AddSeconds((i - 1) * ConfigInitail.DaqInterval)) { return realTimeDataList[i]; } } return null; }
改完之后,一测试,2秒左右就可以加载出来,我靠,这效率,也相差太多了!!!现在才8k多条数据,数据量一大,相差的效率恐怕会更大,对于这种大数据处理情况,还是慎用Linq,不要贪图写代码便捷!