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

时间:2018-09-28 21:13:13

标签: c# entity-framework entity-framework-6 task-parallel-library plinq

下面是代码段。使用EF6。

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

为什么PLINQ慢一些?

2 个答案:

答案 0 :(得分:2)

如果您查看except:的签名,它将使用.AsParallel(),而不是IEnumerable<T>。 linq查询仅在保留为IQueryable的情况下才转换为SQL语句。枚举后,它将执行查询并返回记录。

因此,要细分查询:

IQueryable<T>

这部分代码实际上将在数据库上执行context.cam.AsParallel() ,然后开始遍历结果。结果将传递到ParallelQuery中。这实际上会将整个表加载到内存中。

SELECT * FROM cam

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

如果您跳过.Where(x=> x.cams == "edsfdf") .Select(item => item.fg) .FirstOrDefault() 调用,则所有内容在linq语句中始终保持为IQueryable,因此EntityFramework将发送一个看起来像AsParallel()的SQL命令并返回该单个结果,哪个SQL Server将优化以非常快速的查找,尤其是在凸轮上有索引的情况下。

答案 1 :(得分:0)

速度较慢,因为您在不好的地方使用了parralisim。您的Where子句不会执行繁重的工作,因此使用PLINQ并不是一个好方案。

如果PLINQ带有关联 复杂性,那么它存在的真正好处是什么?

您不需要一百个人就可以在家里找到失踪的孩子,因为找到100个人所需的时间比您自己寻找孩子所需的时间更长。但是,如果您要搜索一片森林,那么这笔开销是值得的,因为仅在一个大森林里找到一个孩子所花的时间就比在一个大森林里找到100个孩子要花更长的时间!

在正确的时间,正确的位置使用并行性是有效的。