3

第二次更新 24.10.2013

我已将这个问题缩小到我的数据库层。显然这是 LINQ2SQL 的性能问题。想象一下在单个查询中加载 10 个实体,然后添加逻辑来检索这 10 个主要实体的子实体。对于性能调整,您希望在一个查询中执行该数据检索,但 L2S 在总共 11 个查询中执行此操作:

  • 一次查询检索 10 个主要实体
  • 为每个主实体检索n 个子实体的十个查询

网上的各种博客和文章都证实了我的发现,尽管这些文章已有几年的历史,有些可以追溯到 2007 年。我发现的文章指出 Entity Framework 是一个可能的解决方案,因为 EF 支持L2S 不支持的预期行为。可悲但真实,看来我将不得不重新编程我的数据库层。

第一次更新 24.10.2013

在 ANTS Profiler 的帮助下,我进一步缩小了这个问题的范围。我的业务逻辑和一般设计似乎有问题。我发现了一种趋势,即创建对象的次数太多,而不仅仅是使用已经创建的版本。我正在进行大修并优化代码,看看这是否会改善最终用户所体验的网站性能。

问题

我在渲染 MVC 视图时遇到了严重的性能问题。根据浏览器控制台,仅用两行文本渲染视图需要 3.75 秒,通过访问 /Innhold/Mangler 在 Chrome 和 Internet Explorer 中进行了测试

该应用程序在 Web.config 中以发布模式构建的生产环境中运行

这个严重的性能问题到底是什么原因?我在这里开始没有想法了。

代码附在下面。

我有以下称为“Feil”的视图:

@{
    ViewBag.Title = "Feil";
    Layout = "";
}

<h2>Feil</h2>
<pre>@ViewBag.Exception</pre>

我在控制器“Innhold”中有以下名为“Mangler”的操作:

public ActionResult Mangler()
{
    ViewBag.Exception = "Det er ikke konfigurert noen nettside for denne lenken.";
    ViewBag.Title = "404";
    ViewBag.WebsiteID = 0;

    return View("~/Views/Shared/Feil.cshtml");
}

我已经清除并添加了我需要的唯一 ViewEngine,并在 Global.asax.cs 的 Application_Start() 中指定了我需要的唯一文件扩展名:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new RazorViewEngine() { FileExtensions = new string[] { "cshtml" } });
}
4

2 回答 2

1

我终于解决了这个问题!

最后,这个性能问题归结为设计不佳的业务层和数据库层。

我使用 ANTS Profiler 缩小了有问题的方法范围,发现在应用程序生命周期中应该只被命中 1 次的构造函数被每个请求命中 36 次。我还检测到由 LINQ2SQL 生成的许多其他需要优化的 SQL 查询,以及对数据库的不需要的调用。

我消除了许多进行数据库调用的 LINQ 查询,优化了剩余的调用,存储了打算重复使用的对象状态,并在我的业务层和数据库层进行了很多一般优化。

我现在正在经历正常的响应时间和低至 170 毫秒的页面加载。像我原来的问题中的示例这样的简单视图也会发生这种情况的原因是因为我有一个自定义基本控制器,它使用数据库在生成视图之前检索一些数据。

结论

需要优化的设计不佳的代码使我的 Web 应用程序反应迟缓且响应缓慢。

结果

在过去 48 小时内实施的彻底优化导致性能大幅提升,现在一切都按预期运行。任务完成!

于 2013-10-24T21:58:37.773 回答
0

我相信你的问题在于编译时间。当应用程序第一次启动时,它需要编译,以便在使用时运行得更快。

看看这个:https ://stackoverflow.com/questions/13794580/mvc-asp-net-startup-time-revisited

于 2013-10-23T20:30:21.593 回答