asp.net-mvc – 如何在每个页面的第一次打击时提高ASP.Net MVC3的性能?

如果我更改剃刀视图,重新编译或等待15-20分钟,页面可能需要3-20秒才能在第一次点击时渲染.我知道视图需要在更改后重新编译.我也明白应用程序将在一段时间不活动后卸载,但我认为这将是第一次打击时的一次性惩罚.但对我来说,它似乎适用于每一页.

以我的主页为例.根据YSlow,它是一个“B”,有15个组件,重250K(包括MiniProfiler的额外jquery参考).从MiniProfiler我看到第一行大约500ms(http:// localhost:80).我假设这包括视图编译.但后来我看到了Find:Index的1200ms.没有SQL调用.首次命中的总加载时间约为3000ms,后续命中约为40ms.

在具有几个部分视图的另一个页面上,父视图需要2400ms到“查找”,其中一个部分视图需要1000ms才能找到.父视图也需要3200ms才能“渲染”.最大的影响是第一行(http:// localhost:80 / User / Dashboard),这是一个惊人的7000毫秒.此页面只有3个查询,总查询时间为100毫秒.总加载时间超过15000ms.随后的命中大约是250毫秒.

我们的设置是ASP.Net MVC 3,Ninject,EF4.2,Razor视图引擎,ELMAH,NLog,Html5Boilerplate和MvcMiniProfiler.我创建了一个重复项目并删除了Ninject,ELMAH,NLog和MvcMiniProfiler.性能只是略快一点.我们在一个区域内有大约15个控制器和大约40个视图.

这是正常的表现吗?当我们部署到Azure时,它(自然地)比在本地测试更糟糕.有改进的建议吗?

编辑:
在IIS / localhost上编译后的第一个命中(在发布模式下并且编译为debug = false)可能是大约15秒.在发布版本中运行的Azure部署具有更快的首次命中,但仍然在5-10秒的范围内.我试过David Ebbo的项目,但没有看到任何戏剧性的东西.

最佳答案 您经常部署此应用程序吗?如果是这样,那么我可以看出为什么第一次打击表现可能会受到关注.

我们经常部署,并创建了一个单独的项目来“预热”我们的部署.它是一个单元测试项目,使用WebDriver在部署后点击我们应用中的每个未编译视图.

基本上,您只需使用WebDriver API启动浏览器,然后使用Navigate()到需要编译的每个URL.运行一次,部署温暖.

此外,在Azure中,您可以关闭空闲超时,以便您的应用永远不会被闲置.我们使用这个脚本:

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00

…并在Azure部署期间运行它,如下所示:

  <Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" taskType="simple" />
点赞