Linq to sql 基准测试Linq2SQL、亚音速2、亚音速3——还有其他更快的方法吗?
我从事亚音速2的工作已经三年多了… 在Linq出现之后,然后是亚音速3,我开始考虑转移到连接到sql的新Linq期货 我必须说,我开始移动亚音速2和亚音速3,很快我发现速度太慢了,我不相信这一点,并开始了所有的测试 然后我测试了Linq2Sql,还看到了一个延迟-将其与亚音速2进行比较 我的问题是,特别是对于linq2sql和即将推出的dotnet版本4,我还可以做些什么来加速它?在linq2sql设置或类上,除了我用于消息的代码之外,还有什么其他内容 我在这里放置了我进行测试的项目,以及结果的屏幕截图 我是如何进行测试的——以及我测量的准确性。 我只使用Google chrome来回答我的问题,因为我很难在这里展示我用更复杂的程序所做的许多其他度量。这是最简单的一个,我只是测量读取的数据。我怎样才能证明这一点。我做了一个简单的线程。睡眠(10秒),看看我是否在Google Chrome Measure上看到这10秒,是的,我看到了Linq to sql 基准测试Linq2SQL、亚音速2、亚音速3——还有其他更快的方法吗?,linq-to-sql,subsonic,subsonic3,benchmarking,performance,Linq To Sql,Subsonic,Subsonic3,Benchmarking,Performance,我从事亚音速2的工作已经三年多了… 在Linq出现之后,然后是亚音速3,我开始考虑转移到连接到sql的新Linq期货 我必须说,我开始移动亚音速2和亚音速3,很快我发现速度太慢了,我不相信这一点,并开始了所有的测试 然后我测试了Linq2Sql,还看到了一个延迟-将其与亚音速2进行比较 我的问题是,特别是对于linq2sql和即将推出的dotnet版本4,我还可以做些什么来加速它?在linq2sql设置或类上,除了我用于消息的代码之外,还有什么其他内容 我在这里放置了我进行测试的项目,以及结果的
(来源:) 这里有更多的睡眠测试,看看Chrome到底提供了什么
只有一个很小的15毫秒的测试,与我的其他测试相比,它是如此之小,我不在乎 那么我衡量的是什么 我只测量通过每种方法读取的数据-不计算数据或数据库延迟,或任何磁盘读取或类似的内容。在后面的图像中,我显示了度量值上不存在磁盘活动
我为什么选择这种测试 这很简单,它是真实的,这接近我的真实问题,我在真实程序中用真实数据发现了亚音速3的延迟 现在让我们测试DAL 我对每个方法都有4-5个调用,一个接一个 结果是。 对于100次的循环,大约要求5行,其中一行不存在 简单adonet:81ms
亚音速2:210ms
linq2sql:1.70秒
使用CompiledQuery的linq2sql。编译:239ms
亚音速3:15.00秒(哇-极慢) 项目
有人能确认这个基准吗,或者做一些优化来帮助我吗? 其他测试 有人在这里发布这个链接(然后删除它-不知道为什么),在这个页面你可以找到一个非常有用的高级测试,除了亚音速2和亚音速3,我在这里 优化 我在这里真正想问的是,现在是否有人能够找到任何技巧来优化dal,不是通过更改测试代码,而是通过更改每个dal上的代码和设置。 例如 优化Linq2SQL 我开始搜索如何优化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);
}
}
}
}
Func编译查询=
CompiledQuery.Compile((DataClassesDataContext meta,int-IdToFind)=>
(来自meta.Products中的myData)
其中myData.ProductID.Equals(IdToFind)
选择myData);
StringBuilder测试=新建StringBuilder();
int[]MiaSeira={5,6,10100,7};
使用(DataClassesDataContext上下文=新DataClassesDataContext())
{
context.ObjectTrackingEnabled=false;
对于(int i=0;i<100;i++)
{
foreach(MiaSeira中的int-EnaID)
{
变量oFindThat2P=compiledQuery(上下文,EnaID);
foreach(oFindThat2P中的产品一)
{
测试。追加(“
”);
Test.Append(一个.ProductName);
}
}
}
}
亚音速3的优化及其问题
我做了很多性能评测,并开始一个接一个地更改,速度更好,但仍然太慢。我把它们贴在亚音速组上,但他们忽略了这个问题,他们说一切都很快
我的结论是,subsonic3更多地关注数据库的结构,而不是数据本身。需要重新考虑要求数据的钻孔方式,如果可能的话,遵循亚音速2的想法
尝试像我在linq2Sql中做的那样将预编译设置为亚音速3,但暂时失败了
优化亚音速2
在我发现亚音速3非常慢之后,我开始检查亚音速2,这是我在相信亚音速3是快之前从未做过的。(确实如此)
因此,它提出了一些可以更快的观点。例如,由于字符串操作和循环内部的比较,这实际上很慢。我必须对你说,这段代码叫万遍!就几分钟!从程序中请求数据的数量
在少量的桌子和小场地上,也许这对一些人来说不是什么大想法
但在大量的表上,延迟甚至更大。所以我自己决定并优化亚音速2,用数字比较代替字符串比较!简单。我几乎在分析器说的每一点上都这么做了,速度很慢。我还改变了所有可以更快一点的小点,并禁用了一些不太常用的点
结果,NorthWind数据库快了5%,而我的数据库有250个表,快了近20%。这是一个计数,在northwind上10秒的处理时间缩短500毫秒,在我的数据库上500毫秒的处理时间缩短100毫秒。我没有为您展示的捕获,因为我用不同的代码、不同的时间和轨迹制作了它们
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();