c# - 对于此代码段,PLINQ 比实际 Linq 慢
问题描述
下面是代码片段。使用 EF6。
var itemNames = context.cam.AsParallel()
.Where(x=> x.cams ==
"edsfdf")
.Select(item => item.fg)
.FirstOrDefault();
为什么 PLINQ 比较慢?
解决方案
如果您查看 的签名.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 将优化该结果以实现非常快速的查找,特别是如果凸轮上有一个索引。
推荐阅读
- java - 使用 Junit 5 参数化对象列表
- javascript - 排序中的 React JS 函数返回 Null
- php - 解决 Laravel 安装 SSL 证书错误
- reactjs - 当用户点击添加新行时如何显示最后一页,以便用户可以使用react js和prime react查看新添加的行
- c# - 增加列表c#中的元素
- jquery - 打开放大弹出窗口
- qt - 如何使用布局将按钮放入另一个按钮
- javascript - 赛普拉斯自定义命令无法被 PhpStorm IDE 识别,但在测试运行程序中工作
- node.js - 配置 Docker 节点的问题
- tableau-api - 从 Tableau Desktop 中的所有工作表批量导出 PNG