SubSonic& LinqTemplate:为什么读这么慢?

时间:2011-05-07 01:52:31

标签: subsonic subsonic3

不知道在他们的论坛上取消这些信息到亚音速工作人员,并说使用stackoverflow,所以我们走了。

我一直在努力通过ORM实现最佳性能。我喜欢亚音速,它的大量插入,更新,删除在这种情况下消除了实体框架,但是对于简单的简单读取,EF以超过5倍的速度从水中吹出亚音速。

我已经删除了两个,删除了更改跟踪,外国属性,导航属性,一切都到了poco。

EF在大约4.8中执行简单的1M行选择,SubSonic Linq占用了5倍......

查看SQL分析器,调用略有不同: 实体框架:SELECT TOP (1000000) [c].[Id] AS [Id], [c].[ProjectIDL] AS [ProjectIDL], [c].[DescriptorIDL] AS [DescriptorIDL], [c].[FieldIDL] AS [FieldIDL], [c].[Data] AS [Data], [c].[OptionId] AS [OptionId] FROM [dbo].[DescriptorFieldValues] AS [c]

亚音速:SELECT TOP (1000000) [t0].[Data], [t0].[DescriptorIDL], [t0].[FieldIDL], [t0].[Id], [t0].[OptionId], [t0].[ProjectIDL] FROM [dbo].[DescriptorFieldValues] AS t0

SQL分析器正在运行跟踪并在此处显示大量的持续时间差异 我在两个查询之前检查了审核登录,它们是相同的......

如果我在sql management studio中运行相同的查询,则两次查询需要11秒

研究亚音速3.04源代码,我无法弄清楚我在哪里进行调整以使其与EF匹配,但是这里的查询语法确实带来了很大的不同,或者是否有一些魔法在我身上不知道?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

除了您的SubSonic查询似乎没有选择ID字段这一事实之外,这两个SQL语句的所有意图和目的都是相同的。发现两个查询在SQL Management Studio中执行的时间相同,似乎支持这一点。

这似乎表明SubSonic确实需要比EF更长的查询时间。 SubSonic is known to have some issues with performance这肯定可以解释这种差异。

但是,真的,我们需要更详细的确切用法,以便真正确定为什么这个查询对你来说较慢的答案。

此外,如果您正在寻找当前活动并帮助使用SubSonic,您应该尝试their Google Group

SubSonic的创始人Rob Conery不久前就停止了工作,“SubSonic工作人员”没有发布任何实质性的更新(如果有的话,我认为他们没有,但我是不完全确定)。这是一个项目,你可以考虑“完成”项目的工作已经停止(出于所有实际目的),但在某种程度上,更多的工作并不是真正需要的(它有效)。

顺便说一句,那个说SubSonic论坛的页面已关闭并进入StackOverflow - 好吧,那些页面在一年多的时间里都没有更新,可能是2页。

答案 1 :(得分:1)

Rob Corney因为想要了解为什么SubSonic与EF相比较慢而受到谴责,并告诉我们想要了解为什么SubSonic出现故障是愚蠢的,我们相信我们的团队已经确定了几个地方来解决这些性能问题:

  1. 在Extensions / Database.cs中,每行加载一次,每个属性反射将数据行序列化为具体对象。
  2. 在Extensions / Database.cs ToEnumerable中,所有DataReader转换都是在1个连续的while循环中完成的。
  3. 在ExecutionBuilder中 - 此查询编译器是alpha的直接复制粘贴,仅用于教育目的查询编译器,并且使用DynamicInvoke严重过时。
  4. 我们的团队计划按以下顺序进行以下修改:

    1. 在Extensions / Database.cs中ToEnumerable将属性信息拉一次并将其传递给负载,这被认为会对性能产生最小的影响,但可能会对内存利用率造成影响。

    2. 修改ToEnumerable以多线程处理大型数据集的实现。

    3. 在对象工厂中添加一个方法,允许在不使用反射的情况下从数据行构造对象,而是提前使用t4模板代码生成。
    4. 在内部加载中,检查对象激活器是否有此接口方法,如果是,请使用此方法,否则,默认返回基于反射的序列化。
    5. 更新ExceutionBuilder以避免使用DynamicInvoke。
    6. 希望这可以使我们的绩效需求得以实现。

      感谢Jeff V,Ken I和QES的帮助。这是可悲的看到亚音速罗布科尼所以防守约亚音速性能的创造者,当它看起来是比较容易解决的。 ~JT

答案 2 :(得分:1)

Subsonic 3非常慢,因为它需要compile again and again and again the same thinks才能进入sql server并询问结果。

这个编译发生在linq部分。

例如,像"Select * FROM Products WHERE ProductID > 100"这样的简单静态命令,在次声3中输入为Products.Find(x => (x.ProductID > 100)需要先花费大量时间转换为字符串命令,我的意思是很长时间。

这是亚音速变速如此缓慢的主要原因,这就是为什么亚音速3变得毫无价值。

在linq中,技巧是CompiledQuery.Compile函数,它编译一次并在内存中记住它。对我而言,我的标准也很慢。

现在回到亚音速2,这是一个非常好的主意,但仍然需要在内部进行大量优化。显然他们没有想太多的速度。无论如何,通过一些优化,亚音速2可以超快,靠近简单的ado命令。

我一年前的测试: Benchmark Linq2SQL, Subsonic2, Subsonic3 - Any other ideas to make them faster?

我的想法是回到亚音速2并使其变得更好和更快,并放弃亚音速3.我感谢他们的亚音速2和3,但在版本3他们失败,它确定,我也做了这些年来的许多程序,并非全部使用。没什么大不了的。