我已经使用Subsonic 2超过3年了...
在Linq出现之后,然后是Subsonic 3,我开始考虑转移到与SQL相关的新Linq futures。
我必须说,我开始移动和移植我的Subsonic 2到SubSonic 3,很快我发现速度非常慢,我不敢相信,并开始所有的测试。
然后我测试了Linq2Sql,也看到了延迟 - 与Subsonic 2进行比较。
我的问题在于,特别是对于linq2sql和即将推出的dotnet版本4,我还能做什么来加快速度?除了我用于测量的代码以外,还有哪些linq2sql设置或类可以使用?
我在这里放置了我进行测试的项目,以及结果的屏幕截图。
我如何进行测试 - 我的测量的准确性。
我只使用Google Chrome来回答我的问题,因为对我来说,在这里展示我使用更复杂程序进行的其他测量是困难的。这是最简单的一个,我只是测量数据读取。我如何证明呢?我做了一个简单的Thread.Sleep(10秒),看看我是否在Google Chrome测量中看到了那10秒钟,是的,我看到了。
(来源: planethost.gr)
这里有更多使用此Sleep线程进行测试的内容,以查看实际上Chrome给出了什么。
只有一个小15ms的测量值,与我做的其他测试相比,它非常小,所以我不在意。
那么我测量了什么
我只测量通过每种方法读取的数据 - 没有计算任何数据或数据库延迟,也没有磁盘读取或任何其他类似的东西。稍后在结果图像中,我将展示测量中不存在任何磁盘活动。
查看此图像,了解我实际上测量了什么以及是否正确
为什么我选择这种测试方式
很简单,它是真实的,并且与我在真实程序中发现的Subsonic 3的延迟问题非常接近。
现在让我们测试DALs
从查看此图像开始。我在每个方法上都有4-5个调用,一个接一个。
结果是这样的。 循环100次,请求5行,其中一行不存在,大约如此。
简单adonet:81毫秒
SubSonic 2:210毫秒
linq2sql:1.70秒
使用CompiledQuery.Compile的linq2sql:239毫秒
Subsonic 3:15.00秒(哇 - 极慢)
项目 http://www.planethost.gr/DalSpeedTests.rar
任何人可以确认此基准测试,或进行任何优化以帮助我吗?
其他测试
有人在这里发布了这个链接 http://ormbattle.net/(然后删除它 - 不知道为什么)。在这个页面中,您可以找到真正有用的高级测试,适用于除了我这里的subsonic 2和subsonic 3之外的所有测试!
优化
我真正想问的是,是否有人可以知道如何通过更改每个dal上的代码和设置来优化DALs的任何技巧,而不是通过更改测试代码。 例如...
优化Linq2SQL
我开始搜索如何优化Linq2sql,并找到 这篇文章,可能还有更多。
最后我使用那页的技巧运行并优化了代码。速度接近1.50秒,从1.70秒提高了很多...大幅改善,但仍然很慢。
然后我发现了一篇不同方式 - 相同思路的文章,哇!速度飞起。 使用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和问题
我进行了许多性能分析,并逐一更改,速度有所提高,但仍然太慢。我在subsonic组中发布了它们,但他们忽略了这个问题,他们说一切都很快...
这里是我的性能分析和subsonic源代码中的延迟点的一些截图
我发现subsonic3对数据库结构的调用比对数据本身的调用更多。需要重新考虑请求数据的方式,并遵循subsonic2的思路(如果可能的话)。
尝试像我在linq2Sql中做的那样对subsonic 3进行预编译,但目前失败了...
优化SubSonic 2
在我发现subsonic 3极其缓慢之后,我开始检查subsonic 2 - 我以前从未这样做过,认为它很快。(确实如此)
因此,它提出了一些可以更快的点。例如,有许多类似这些的循环 实际上很慢,因为循环内部有字符串操作和比较。我必须告诉你,这段代码被调用了数百万次!在几分钟的时间内!从程序中请求数据。
对于小量的表和小字段,对于一些人来说可能不是什么大问题,
但是在大量的表上,延迟更加严重。因此,我决定通过自己替换字符串比较为数字比较来优化subsonic 2!简单。我几乎在每个性能分析器指出的缓慢点都进行了更改。我还更改了所有可以更快的小点,并禁用了一些不太使用的功能。
结果,在NorthWind数据库上快5%,在我的具有250个表的数据库上快近20%。在northwind上,10秒处理中少了500ms,在我的数据库上,500ms处理时间快了100ms。我没有截图展示它们,因为我用不同的代码、不同的时间制作了它们,并在纸上跟踪了它们。
无论如何,这就是我的故事和问题,你还知道什么可以使它们更快...
对于这些措施,我使用了由我优化的Subsonic 2.2、由我略微优化的Subsonic 3.0.0.3和Dot.Net 3.5。