【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倍左右。测试代码:
编译lambda表达式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);
性能差异14-15倍。测试代码:
使用DataLoadOptions.LoadWithAdventureWorksDataContext 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);
性能差异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);