惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
L
LangChain Blog
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
量子位
The GitHub Blog
The GitHub Blog
博客园 - 【当耐特】

博客园 - 分享 共赢

大爱,netbeans的远程开发 lvs + keepalived udp小结 web项目下,甩开RazorTemplateEngine做模板处理 将watin的ui单元测试集成到cc.net 命令行发布web项目 Microsoft © SilverlightTM Release History 针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能 不同IComparer对数组排序Array.Sort,Linq orderby的性能的影响 c# 编译器优化的功劳?与泛型有关的代码的疑惑 高效获取某个数字的最后2位 centos asp.net运行环境配置 扣出MSLinqToSQLGenerator的基类,可用于开发自定义工具(custom tool) [转]我在微软做PM ... April Rosario(vs2010?) CTP now available! 手工杀毒利器 在form上设定了defaultbutton属性之后,切换提交按钮的解决办法 在form上设定了defaultbutton属性之后,切换提交按钮的解决办法 Bingo Day-展示自我,共享成功! 使用System.Net.Mail发送邮件,vs2005与vs2008存在差别?
Linq to sql 简单性能差异指引
分享 共赢 · 2008-04-22 · via 博客园 - 分享 共赢

      测试环境:
        cpu: tk55
        ram: 2g
        hd:120g
        os:vista+sp1
        sql:sql2005开发版
      以下测试只跑一两次,取最后一次(一般第一次会很慢)。

      1.禁用

ObjectTrackingEnabled
         当只是查询数据而不跟踪对象状态时禁用,将极大的提供查询性能。性能差异在36倍左右。测试代码:

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            adventureWorks1.ObjectTrackingEnabled 
= true;
            var q1 
= (from p in adventureWorks1.Products select p).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            adventureWorks2.ObjectTrackingEnabled 
= false;
            var q2 
= (from p in adventureWorks2.Products select p).ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

        输出:
        11232000
        312000

     2.不记录输出
        输入记录一般只用在开发阶段,在部署环境中一般不使用。性能差异在17-18倍左右。测试代码:

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            adventureWorks1.Log 
= Console.Out;
            var q1 
= (from p in adventureWorks1.Products select p).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            var q2 = (from p in adventureWorks2.Products select p).ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

输出
SELECT [t0].[ProductID], [t0].[Name], [t0].[ProductNumber], [t0].[MakeFlag], [t0
].[FinishedGoodsFlag], [t0].[Color], [t0].[SafetyStockLevel], [t0].[ReorderPoint
], [t0].[StandardCost], [t0].[ListPrice], [t0].[Size], [t0].[SizeUnitMeasureCode
], [t0].[WeightUnitMeasureCode], [t0].[Weight], [t0].[DaysToManufacture], [t0].[
ProductLine], [t0].[Class], [t0].[Style], [t0].[ProductSubcategoryID], [t0].[Pro
ductModelID], [t0].[SellStartDate], [t0].[SellEndDate], [t0].[DiscontinuedDate],
 [t0].[rowguid], [t0].[ModifiedDate]
FROM [Production].[Product] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

       11076000
       624000

      3.编译

lambda表达式
         性能差异14-15倍。测试代码:

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            var q1 
= (from p in adventureWorks1.Products select p).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            var compiledQuery 
= CompiledQuery.Compile((AdventureWorksDataContext ctx) => from p in ctx.Products select p);
            var q2 
= compiledQuery(adventureWorks2).ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

         输出:
         11076000
         780000

       4.使用DataLoadOptions.LoadWith
            性能差异5-6倍左右。测试代码:

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 = DateTime.Now;
            var q1 = (from o in adventureWorks1.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d2 = DateTime.Now;
            Console.WriteLine(d2.Ticks - d1.Ticks);

            AdventureWorksDataContext adventureWorks2 = new AdventureWorksDataContext();
            DateTime d3 = DateTime.Now;
            DataLoadOptions options = new DataLoadOptions();
            options.LoadWith<WorkOrder>(o => o.Product);
            adventureWorks2.LoadOptions = options;
            var q2 = (from o in adventureWorks2.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d4 = DateTime.Now;
            Console.WriteLine(d4.Ticks - d3.Ticks);

          输出:
          11700000
          2184000

        5.使用延迟加载(系统默认)
           性能差异42-43倍左右。测试代码          

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            adventureWorks1.DeferredLoadingEnabled 
= true;
            var q1 
= (from o in adventureWorks1.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            adventureWorks2.DeferredLoadingEnabled 
= false;
            var q2 
= (from o in adventureWorks1.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

           输出:
          26676000
          624000

        6.使用sql语句
            性能差异 7倍左右

AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            var q1 
= (from o in adventureWorks1.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 
= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            var q2 
= adventureWorks2.ExecuteQuery<Product>(@"SELECT [t0].[WorkOrderID], [t0].[ProductID], [t0].[OrderQty], [t0].[StockedQty], [t0].[ScrappedQty], [t0].[StartDate], [t0].[EndDate], [t0].[DueDate], [t0].[ScrapReasonID], [t0].[ModifiedDate]
                                                            FROM [Production].[WorkOrder] AS [t0]
                                                            WHERE [t0].[ProductID] = 3
").ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

            输出:
            11856000
            1716000

        7.使用储存过程
            性能差异20倍左右。测试代码:

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            var q1 
= (from o in adventureWorks1.WorkOrders where o.ProductID == 3 select o).ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            var q2 
= adventureWorks2.GetWorkOrderByProductID(3).ToList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

-- ================================================
--
 Template generated from Template Explorer using:
--
 Create Procedure (New Menu).SQL
--
--
 Use the Specify Values for Template Parameters 
--
 command (Ctrl-Shift-M) to fill in the parameter 
--
 values below.
--
--
 This block of comments will not be included in
--
 the definition of the procedure.
--
 ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
--
 Author:        <Author,,Name>
--
 Create date: <Create Date,,>
--
 Description:    <Description,,>
--
 =============================================
CREATE PROCEDURE Production.GetWorkOrderByProductID
    
-- Add the parameters for the stored procedure here
    @ProductID int
AS
BEGIN
    
-- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    
SELECT [t0].[WorkOrderID][t0].[ProductID][t0].[OrderQty][t0].[StockedQty][t0].[ScrappedQty][t0].[StartDate][t0].[EndDate][t0].[DueDate][t0].[ScrapReasonID][t0].[ModifiedDate]
                                                            
FROM [Production].[WorkOrder] AS [t0]
                                                            
WHERE [t0].[ProductID] = @ProductID
END
GO

            输出:
            12168000
            624000

    8、获取数据以用于数据绑定  
        性能差异1.5倍左右。测试代码:  

            AdventureWorksDataContext adventureWorks1 = new AdventureWorksDataContext();
            DateTime d1 
= DateTime.Now;
            var q1 
= adventureWorks1.Products.ToList();
            DateTime d2 
= DateTime.Now;
            Console.WriteLine(d2.Ticks 
- d1.Ticks);

            AdventureWorksDataContext adventureWorks2 

= new AdventureWorksDataContext();
            DateTime d3 
= DateTime.Now;
            var q2 
= adventureWorks2.WorkOrders.GetNewBindingList();
            DateTime d4 
= DateTime.Now;
            Console.WriteLine(d4.Ticks 
- d3.Ticks);

        输出:
        10140000
        6708000