第二次更新 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" } });
}