基准Linq2SQL,Subsonic2,Subsonic3 – 任何其他的想法,使他们更快?
我正在与亚音速2超过3年现在…
在Linq出现之后,随后是Subsonic 3,我开始考虑转向连接到sql的新Linq期货。
我必须说,我开始移动和SubSonic 3端口我的亚音速2,很快我发现,速度是如此之慢,我不相信 – 并开始所有的testing。
然后我testingLinq2Sql,并看到一个延迟 – 比较它与Subsonic 2。
我的问题是,特别是对于linq2sql和即将到来的dotnet版本4,我还能做些什么来加速它? 还有什么linq2sql设置,或类,而不是我用这个代码我的电话
我在这里把我做testing的项目放在这里,也是结果的屏幕截图。
我如何进行testing – 以及我的措施的准确性。
我只用于我的问题谷歌浏览器,因为它很难让我在这里展示很多其他措施,我已经做了更复杂的程序。 这是最简单的一个,我只是测量数据读取。 我怎么能certificate这一点。 我做了一个简单的Thread.Sleep(10秒),看看我在Google Chrome Measure上看到了10秒,是的,我看到了。
GoogleChromeFastSpeedMesure.gif
这里是更多的testing与这个睡觉thead看什么实际上铬给。
10秒延迟
延迟100毫秒
零延迟
只有一小段15ms的时间会变得很短暂,与我其余的testing相比,我并不在乎。
所以我测量
我只是测量通过每种方法读取的数据 – 没有计算数据或数据库延迟,或任何磁盘读取或类似的东西。 后来的图像与结果我显示没有磁盘活动存在的措施
看到这个图片,看看我测量的是什么,如果这是正确的
为什么我select了这种testing
它很简单,它是真实的,而我真正的问题在于,我发现真正的数据在实际程序中出现亚音速3的延迟。
现在让我们来testing一下
首先看到这个图像,我有4-5调用每个方法,一个接一个。
结果是。 对于一个循环100次,要求5行,一个不存在,近似..
简单的adonet: 81ms
SubSonic 2: 210ms
linq2sql: 1.70秒
linq2sql使用CompiledQuery.Compile: 239ms
亚音速3: 15.00秒 (哇 – 极端缓慢)
该项目http://www.planethost.gr/DalSpeedTests.rar
任何人都可以证实这个基准,或者做任何优化来帮助我吗?
其他testing
有人在这里发布这个链接http://ormbattle.net/ (然后删除它 – 不知道为什么)在这个页面中,你可以find一个非常有用的高级testing,除了亚音速2和亚音速3,我在这里!
优化
这里我真正要问的是,现在有人可以诀窍如何优化DAL,而不是通过更改testing代码,而是通过更改每个dal的代码和设置。 例如…
优化Linq2SQL
我开始search如何优化Linq2sql,并发现这篇文章 ,也许更存在。
最后,我从这个页面开始运行,并使用它们来优化代码。 从1.70的速度是接近1.50秒….大的改善,但仍然缓慢。
然后,我发现了一个不同的方式 – 同样的想法文章 ,哇! 速度是炸毁的。 使用CompiledQuery.Compile这个技巧,1.5秒的时间现在是239ms。 这里是预编译的代码
Func<DataClassesDataContext, int, IQueryable<Product>> compiledQuery = CompiledQuery.Compile((DataClassesDataContext meta, int IdToFind) => (from myData in meta.Products where myData.ProductID.Equals(IdToFind) select myData)); StringBuilder Test = new StringBuilder(); int[] MiaSeira = { 5, 6, 10, 100, 7 }; using (DataClassesDataContext context = new DataClassesDataContext()) { context.ObjectTrackingEnabled = false; for (int i = 0; i < 100; i++) { foreach (int EnaID in MiaSeira) { var oFindThat2P = compiledQuery(context, EnaID); foreach (Product One in oFindThat2P) { Test.Append("<br />"); Test.Append(One.ProductName); } } } }
优化SubSonic 3和问题
我做了许多性能分析,并开始改变一个接一个,速度更好,但仍然太慢。 我把它们张贴在亚音速组上,但他们忽略了这个问题,他们说一切都很快。
下面是一些在亚音速源代码中捕获我的分析和延迟点
最后,subsonic3更多地调用数据库的结构而不是数据本身。 需要重新考虑要求数据的漏洞方式,如果可能的话,遵循亚音速2的思路。
尝试预编译亚音速3,就像我在linq2Sql中做的那样,但暂时失败…
优化SubSonic 2
当我发现亚音速3速度很慢的时候,我开始对亚音速2进行检查 – 我以前从来没有做过相信速度很快的检查。 (而且是)
所以它提出了一些可以更快的要点。 例如,像这样的循环有很多 ,实际上由于string操作而比较慢,并且在循环内进行比较。 我必须告诉你,这个代码被称为百万次! 在几分钟的时间! 从程序询问的数据。
对于less量的桌子和小的场地,也许这对于一些人来说不是一个大的想法,
但是在大量的表格上,延迟更大。 所以我自己决定优化亚音速2,通过更换string比较,和数字比较! 简单。 几乎所有的分析师都说这个速度很慢。 我也改变所有可以更快一点的小点,并禁用一些不那么习惯的想法。
结果,NorthWind数据库的速度提高了5%,在250个表的数据库上提高了近20%。 在northwind的10秒钟内,这个数值比500msless500ms的处理时间,在我的数据库上快100ms。 因为我用不同的代码,不同的时间,把它们logging在纸上,所以我没有捕获的东西给你看。
无论如何,这是我的故事和我的问题,你还知道甚么让他们更快?
对于这个措施我使用了由我优化的Subsonic 2.2,由我稍微优化的Subsonic 3.0.0.3,以及Dot.Net 3.5
Aristos,这是我遇到的问题。 您向我们的团队发了一个问题,我们有一个很好的,长达23年的电子邮件交换。 你坚持认为SubSonic 3有问题,你问我为什么还没有解决这个“慢,破的工具”。
我试着向你解释,有233张桌子,SubSonic必须在加载时读取每一个的模式。 这不是SubSonic 3的典型用法,但是我们这样做,所以在后续的加载过程中实际上比SubSonic 2更快。
你正在想这个。 我正在回答你 RBarry在上面留下了一个评论,我是beind“denigrating”。 我很沮丧 你似乎认为我没有这个东西的基准,我有很多次。 我不能用你提出的问题来解决ORM问题,但我没有。
你必须明白,如果使用亚音速10秒来运行查询,那么它将不会被使用。
所以 – 你的回答:233个表,作为类脚本化,需要在第一次运行时加载到提供者内存。
太多了。 SubSonic不是你的工具。
我想在这些上得到更好的Benchmark,你应该在sql profiler中检查一下,而不是在google chrome中,因为在浏览器中可能会影响页面加载速度的很多事情。
你的速度testing是一个网页,在我看来,你的testing看起来像加载需要多长时间。 SubSonic并不慢,在网页上testing加载时间是相当荒谬的。
如果你想真正的testing你需要使用控制台的基准,并运行对索引数据有效的读取循环。 你所做的是创build一个网页,并说“让我们看看负载上发生了什么”。
这有几个原因是有缺陷的。 首先 – 所有编写的代码都需要从IL do ML进行编译。 因为SubSonic为你生成你的代码,而且因为我知道你在这里有很多的表(如果我没有记错的话,有300多个表),你可以想象在你第一次加载的时候有一些工作正在进行。
在这里要坦白一点 – 你的经验不足就是通过发布“缓慢而未准备好”这样的东西来解开我自由投入的大量工作。 我不在乎人们是否使用亚音速 – 当人们做愚蠢的事情(比如基准networkingtesting)时,我会很在意,并责备我。
根据您的示例,您可以使用以下代码来提高性能:
StringBuilder Test = new StringBuilder(); int[] MiaSeira = { 5, 6, 10, 100, 7 }; for (int i = 0; i < 100; i++) { foreach (int EnaID in MiaSeira) { var Products = (from product in Product. where MiaSeira.Contains(product.ProductID) select product).ToList(); if (Products == null || Products.Count == 0) continue; foreach (Product product in Products) { Test.Append("<br />"); Test.Append(product.ProductName); } } } txtDebug.Text = Test.ToString();
我没有亚音速的第一手经验,但是如果它正在做一堆代码生成,你可能想要发布第一个请求(冷)和平均后续请求(温暖)的单独结果。 您还应该使用秒表来计时数据提取部分,所以您不要将其他计时混合到数据中。