首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >此代码段的PLINQ比实际Linq慢

此代码段的PLINQ比实际Linq慢
EN

Stack Overflow用户
提问于 2018-09-29 05:13:13
回答 1查看 221关注 0票数 -2

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

代码语言:javascript
运行
复制
var itemNames = context.cam.AsParallel()
                    .Where(x=> x.cams == 
                     "edsfdf")
                    .Select(item => item.fg)
                    .FirstOrDefault();

为什么PLINQ比较慢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-29 06:27:36

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

因此,要分解您所拥有的查询:

代码语言:javascript
运行
复制
context.cam.AsParallel()

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

代码语言:javascript
运行
复制
.Where(x=> x.cams == "edsfdf")
.Select(item => item.fg)
.FirstOrDefault()

在此之后,所有这些操作都将并行进行。与启动大量线程并管理它们之间的锁定和并发的开销相比,一个简单的字符串相等比较可能是非常便宜的( PLINQ将为您处理)。并行处理和成本/收益是一个复杂的主题,但它通常是best saved for CPU-intensive work

如果您跳过了AsParallel()调用,那么在linq语句的整个过程中,所有内容都保持为IQueryable,因此EntityFramework将发送一个类似于SELECT fg FROM cam WHERE cams = 'edsfdf'的命令并返回该结果,SQL Server将对该结果进行优化以实现非常快速的查找,特别是在cams上有索引的情况下。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52562730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档