技术开发 频道

Linq to sql 简单性能差异指引


【IT168技术文档】

  禁用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);
  不记录输出
  输入记录一般只用在开发阶段,在部署环境中一般不使用。性能差异在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);
  编译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);
  使用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);
0
相关文章