【发布时间】:2011-01-22 18:04:16
【问题描述】:
我与 Subsonic 2 合作已经 3 年多了...
在 Linq 出现,然后是 Subsonic 3 之后,我开始考虑转移到连接到 sql 的新 Linq 期货。
我必须说我开始使用 SubSonic 3 移动和移植我的 subsonic 2,很快我发现速度如此之慢以至于我不相信 - 并开始了所有测试。
然后我测试 Linq2Sql 并看到延迟 - 将其与 Subsonic 2 进行比较。
我的问题是,特别是对于 linq2sql 和即将推出的 dotnet 版本 4,我还能做些什么来加快它的速度? linq2sql 设置或类还有什么,而不是我用于我的问题的这段代码
我将我进行测试的项目以及结果的屏幕截图放在这里。
我如何进行测试 - 以及我的测量结果是否准确。
我只使用谷歌浏览器来回答我的问题,因为我很难在这里展示我用更复杂的程序完成的许多其他措施。这是最简单的一个,我只是测量Data Read。我怎么能证明这一点。我做了一个简单的 Thread.Sleep(10 seconds),看看我是否在 Google Chrome Measure 上看到了 10 秒,是的,我看到了。
(来源:planethost.gr)
这里有更多关于这个 Sleep thead 的测试,看看 Chrome 实际提供了什么。
10 seconds delay
100 ms delay
Zero delay
只有 15 毫秒的小问题,与我不关心的其他测试相比,它是如此之小。
所以我衡量的是什么
我只测量通过每种方法读取的数据 - 没有计算数据或数据库延迟,或任何磁盘读取或类似的东西。稍后在带有结果的图像上,我显示度量上不存在磁盘活动
See this image to see what really I measure and if this is correct
我为什么选择这种测试
它很简单,它是真实的,它接近我真正的问题,我在真实数据的真实程序中发现了亚音速 3 的延迟。
现在让我们测试一下dals
Start by see this image 我对每个方法都有 4-5 次调用,一个接一个。
结果是。 对于一个 100 次的循环,请求 5 行,一个不存在,大约..
简单的 adonet:81ms
亚音速 2:210 毫秒
linq2sql:1.70 秒
linq2sql 使用 CompiledQuery.Compile :239ms
亚音速 3:15.00 秒(哇 - 极慢)
项目 http://www.planethost.gr/DalSpeedTests.rar
任何人都可以确认这个基准,或进行任何优化来帮助我吗?
其他测试
有人在此处发布此链接http://ormbattle.net/(然后将其删除-不知道为什么)在此页面中,您可以找到对所有人非常有用的高级测试,除了我在这里的亚音速 2 和亚音速 3 !
优化
我在这里真正要问的是,现在是否有人可以通过更改每个 dal 上的代码和设置来优化 DAL,而不是通过更改测试代码来优化 DAL。 比如……
优化 Linq2SQL
我开始搜索如何优化Linq2sql,发现 this article,也许还有更多。
最后,我使该页面中的技巧运行起来,并使用它们来优化代码。速度从 1.70 接近 1.50 秒.... 很大的改进,但仍然很慢。
然后我找到了different way - same idea article,哇!速度被炸飞了。 将这个技巧与 CompiledQuery.Compile 结合使用,从 1.5 秒开始的时间现在是 239 毫秒。 这是预编译的代码...
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 和问题
我做了很多性能分析,并开始一个接一个地更改,速度更好但仍然太慢。我将它们发布在亚音速组但他们忽略了这个问题,他们说一切都很快......
Here is some capture of my profiling and delay points inside subsonic source code
我最终认为 subsonic3 更多地调用数据库的结构而不是数据本身。需要重新考虑求数据的坑道,如果可能的话,按照subsonic2的思路。
尝试像我在 linq2Sql 中那样预编译到亚音速 3,但暂时失败了......
优化 SubSonic 2
在我发现亚音速 3 非常慢之后,我开始检查亚音速 2 - 在我认为它很快之前我从未做过。 (确实如此)
所以它提出了一些可以更快的点。例如 there are many loops like this ones 实际上很慢,因为字符串操作和循环内的比较。我必须对你说,这段代码被调用了百万次!上几分钟!程序要求的数据。
对于少量的表格和小字段,这对某些人来说可能不是什么大问题,
但在大量表上,延迟甚至更多。所以我自己决定和优化亚音速2,通过替换字符串比较,用数字比较!简单的。我几乎在分析器所说的每一个点上都这样做很慢。我还更改了所有可以更快一点的小点,并禁用了一些不常用的想法。
结果,在 NorthWind 数据库上快 5%,在我的拥有 250 个表的数据库上快近 20%。在北风的 10 秒内处理时间减少了 500 毫秒,在 500 毫秒的处理时间内在我的数据库上快了 100 毫秒。我没有截图可以展示给你,因为我用不同的代码、不同的时间制作了它们,并在纸上追踪它们。
无论如何,这是我的故事和我的问题,你还知道什么可以让它们更快......
为此,我使用了我优化的 Subsonic 2.2、我稍微优化的 Subsonic 3.0.0.3 和 Dot.Net 3.5
【问题讨论】:
-
似乎很清楚 Subsonic 3 测试存在一些问题。也许是配置错误?
-
对亚音速 3 的任何帮助! - 我也问过创作者,但不想评论那个速度。
-
您的问题太模糊,无法得到任何有用的答案。您需要发布一个简单的示例,说明您的代码运行缓慢的确切部分。最好是其他人可以拿走自己进行比较的。在你能做到之前,我看不出任何人可以如何为你回答这个问题。
-
Dera Adam,我已经上传了项目,源代码在里面,很简单,请抓紧时间自己下载看看。
-
如果您无法将确切的代码发布到问题中,那么我无法帮助您。您的基准不是基准,您不知道代码中的瓶颈在哪里。令人惊讶的是,我没有时间为您下载安装程序和调试您的项目。
标签: linq-to-sql subsonic subsonic3 benchmarking performance