Linq to sql 基准测试Linq2SQL、亚音速2、亚音速3——还有其他更快的方法吗?

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设置或类上,除了我用于消息的代码之外,还有什么其他内容 我在这里放置了我进行测试的项目,以及结果的

我从事亚音速2的工作已经三年多了…

在Linq出现之后,然后是亚音速3,我开始考虑转移到连接到sql的新Linq期货

我必须说,我开始移动亚音速2和亚音速3,很快我发现速度太慢了,我不相信这一点,并开始了所有的测试

然后我测试了Linq2Sql,还看到了一个延迟-将其与亚音速2进行比较

我的问题是,特别是对于linq2sql和即将推出的dotnet版本4,我还可以做些什么来加速它?在linq2sql设置或类上,除了我用于消息的代码之外,还有什么其他内容

我在这里放置了我进行测试的项目,以及结果的屏幕截图

我是如何进行测试的——以及我测量的准确性。 我只使用Google chrome来回答我的问题,因为我很难在这里展示我用更复杂的程序所做的许多其他度量。这是最简单的一个,我只是测量读取的数据。我怎样才能证明这一点。我做了一个简单的线程。睡眠(10秒),看看我是否在Google Chrome Measure上看到这10秒,是的,我看到了


(来源:)

这里有更多的睡眠测试,看看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();