c# - Linq-to-SQL 的开销

标签 c# asp.net asp.net-mvc performance linq-to-sql

我们目前遇到一个用 ASP.NET MVC 4 编写的网站的性能问题,特别是与 Linq-to-SQL 相关的开销,因此导致(除其他外)CPU 在每次页面请求时都跳到 100%,其中使用 Linq-to-SQL。

我正在使用 ANTS Performance Profiler 8.5 Pro 分析应用程序,并且在开发和生产环境中都遇到了相同的结果。但是在生产环境中的性能远比在开发环境中差。

通过 ANTS,在实例化 Linq-to-SQL 数据上下文和执行非常简单的查询时,我似乎已经将其缩小到开销,例如:

using (var db = new D.DataClassesDataContext(ConfigurationManager.ConnectionStrings["Master"].ConnectionString))
{
    db.ObjectTrackingEnabled = false;

    HttpContext.Cache["WebPageTemplateCapabilities"] = (from x in db.Clients
                                                        where x.ClientID == this.ClientID
                                                        select x.WebPageTemplateCapabilities).SingleOrDefault();
}

我终其一生都无法弄清楚为什么像这样的简单查询会造成如此大的性能损失。此代码片段最多需要 1.5 秒才能运行,与在 SSMS 中执行的相同查询相比,这简直是疯了。在这一点上,我假设高 CPU 使用率可能是该网站进行任何数据库通信的结果。

我错过了什么?这是为了记录在网站生命周期中实例化的第一个数据上下文和执行的查询。

最佳答案

如果您使用 Linq to SQL 并且多次调用同一个查询,那么我建议您使用编译函数。上面的查询可以写成如下:

private static Func<DataClassesDataContext, string, string> MyCompiledFunction =
        CompiledQuery.Compile((DataClassesDataContext pContext, string pClientID) =>
            (from x in pContext.Clients
             where x.ClientID == pClientID
             select x.WebPageTemplateCapabilities).SingleOrDefault();

您没有指定返回类型或客户端 ID,因此我假设它们是字符串。

请注意,第一次编译该函数时会产生开销 - 之后它会大大加快,我们的代码速度提高了 5 或 6 倍。如果它只被调用过一次,那么请不要打扰。

关于c# - Linq-to-SQL 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879712/

相关文章:

c# - 空条件运算符

c# - 将 Owin/Katana 与 ASP.NET Core(实际用例)一起使用是否仍然相关?

c# - 什么时候需要 .ascx 文件以及如何使用它们?

jquery - ASP.NET 中的交互式仪表板

c# - 条件模型状态合并

c# - 带TimeSpan的定时器和自制定时器比秒表慢

c# - 内部不能有带有动态代码的 [Authorize()]

c# - 在 .Net 中打印

asp.net-mvc - 我可以从 HttpContext 访问 ViewData 吗?

c# - 如何将复杂类型传递给 Html.LabelFor?