如果我更改剃刀视图,重新编译或等待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的项目,但没有看到任何戏剧性的东西。
答案 0 :(得分:2)
您经常部署此应用程序吗?如果是这样,那么我可以看出为什么第一次打击表现可能会受到关注。
我们经常部署,并创建了一个单独的项目来“预热”我们的部署。它是一个单元测试项目,使用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" />