首页 > 解决方案 > 对于此代码段,PLINQ 比实际 Linq 慢

问题描述

下面是代码片段。使用 EF6。

var itemNames = context.cam.AsParallel()
                    .Where(x=> x.cams == 
                     "edsfdf")
                    .Select(item => item.fg)
                    .FirstOrDefault();

为什么 PLINQ 比较慢?

标签: c#entity-frameworkentity-framework-6task-parallel-libraryplinq

解决方案


如果您查看 的签名.AsParallel(),它需要一个IEnumerable<T>,而不是IQueryable<T>。linq 查询仅在保存为 IQueryable 时转换为 SQL 语句。一旦你枚举它,它就会执行查询并返回记录。

因此,要分解您的查询:

context.cam.AsParallel()

这段代码本质上将SELECT * FROM cam在数据库上执行,然后开始迭代结果。结果将被传递到ParallelQuery中。这基本上会将整个表加载到内存中。

.Where(x=> x.cams == "edsfdf")
.Select(item => item.fg)
.FirstOrDefault()

在此之后,所有这些操作将并行发生。与启动大量线程并管理它们之间的锁定和并发性(PLINQ 会为您处理)的开销相比,一个简单的字符串相等比较可能非常便宜。并行处理和成本/收益是一个复杂的话题,但它通常最好留给 CPU 密集型工作

如果您跳过AsParallel()调用,所有内容在 linq 语句中一直保持为 IQueryable,因此 EntityFramework 将发送一个看起来像的单个 SQL 命令SELECT fg FROM cam WHERE cams = 'edsfdf'并返回该单个结果,SQL Server 将优化该结果以实现非常快速的查找,特别是如果凸轮上有一个索引。


推荐阅读