当前位置:  开发笔记 > 数据库 > 正文

LINQ的可扩展性如何?

如何解决《LINQ的可扩展性如何?》经验,为你挑选了4个好方法。

最近与同事的对话产生了不同的观点.什么说你,SO成员?

我知道,甚至可扩展性的概念也可以采用许多不同的方式和背景,但这是讨论的一部分.每个人似乎都对可伸缩性的真正含义有不同的看法.我很想知道这里的变化也是如此.事实上,我只针对这个概念发布了一个问题.



1> Lou Franco..:

我猜想最好的检查方法是编写基准,但在我看来,LINQ有可能优化手工编写类似的代码.我不知道它如何利用这些优势.

LINQ允许您表达您想要的内容,而不是如何生成它.一个明显的优点是LINQ可以自动并行化(参见PLINQ).

LINQ的另一个优点是它很懒,所以你可以根据需要从集合中进行计算.您可以手动编写等效的代码,但在LINQ中可能更容易实现.



2> bh213..:

在我们做的测试中,LINQ to objects(ForEach)比foreach循环慢约2倍.

LINQ to SQL(MS SQL数据库)比使用数据读取器的直接查询慢近10倍,使用大部分时间从表达式树创建SQL(因此,您将受CPU限制并且数据库将处于空闲状态)为避免这种情况,您必须使用编译的查询.

有关更多信息,请参阅 帖子中的大多数信息仍然适用于.NET 3.5 SP1.



3> Robert Rossn..:

这个问题有点像问"收藏的可扩展性如何?"

我们来谈谈对象的LINQ.一般来说,在大多数实现IEnumerable迭代基础集合中的每个项目的程度上,LINQ具有很大的扩展能力.创建一个List包含一千万个项目的东西,如下所示:

var list = from Foo f in fooList
           where f.Value = "Bar"
           select f;

会很慢.但这确实不是LINQ的错.你是那个给它一千万件物品清单的人.

如果LINQ不存在,你就像处理它一样处理这个问题:通过构建Dictionaries和SortedLists等来帮助你减少搜索空间.

LINQ可以通过延迟查询执行来提高可伸缩性(以及使可伸缩性更容易获得).您可以使用一系列LINQ查询替换创建列表,将其过滤到新列表,过滤到新列表等的天真方法:

var list1 = from Foo f in fooList where f.Value1 = "Bar" select f;
var list2 = from Foo f in list1 where f.Value2 = "Baz" select f;
var list3 = from Foo f in list2 where f.Value3 = "Bat" select f;

当(并且如果)有必要迭代最终列表时,所有这些都在一次通过底层集合时执行.但是,这并不是什么新鲜事:如果你没有LINQ,你可能最终会用一个做同样事情的方法替换你的天真方法.但是LINQ使它变得容易多了.



4> Sklivvz..:

在我看来,LINQ旨在从开发的角度简化事情,而不是解决可伸缩性问题.

实际上,使用LINQ可以通过隐藏许多复杂功能使事情变得如此简单,并且当不负责任地使用时,它可能导致可伸缩性问题.

其他答案中有很多例子,但最重要的是:

如果要查询对象集合,则无法忽略其大小.也许在模型中使用LINQ,当有一些对象要查询时听起来不错......但随着大小的增加,很明显查询应该在数据库中发生,而不是在模型中.

如果您使用LINQ自动生成SQL,据我所知,您无法提供有关如何编译查询的数据库提示,例如WITH (NOLOCK).随着您的桌面规模的增长,能够解决这些问题势在必行.

与上述类似,但可能更为通用:当您解决DB上的可伸缩性问题时,您必须控制数据库正在执行的操作.拥有一个编译为SQL的语言,然后再将其编译为执行计划,从您手中删除控制权.

如果您必须更改数据库模式以使其更具可伸缩性并且您的代码与它紧密相关,因为您没有存储过程,会发生什么?

虽然看起来很简单,但是你不能轻易改变LINQ提供程序:查询SQL Server与查询对象或查询XML不同.LINQ非常相似.我确实希望我的一些初级开发人员能够进行"LINQ狂欢",因为它比学习如何在可扩展性方面做得更容易.

总而言之,我认为可以使用LINQ编写可伸缩代码,但只能小心使用它.没有杀手级工具,只有杀手级代码.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有