2014-09-03 156 views
5

我有一个MVC 5.x应用程序,它的视图预编译并合并成一个单一的程序集。即使所有这些在AppDomain启动后第一次对视图的请求都很慢,请求的视图并不重要,因为它们在第一次请求视图时都很慢。使用MiniProfiler挖掘我可以看到这是视图上的“渲染”时间,它占用了大部分时间,并且对视图的额外请求渲染时间减少了大约90%。所以要清楚的是,这是第一次呈现,这是分配的时间。由于事实上所有的视图都经过了预编译,我并不期望看到这样的缓慢,我不相信这是造成这种大幅减速的JIT ......任何人都有任何猜测或见解?编译MVC视图仍然第一请求缓慢渲染

请注意,这不是Web应用程序的第一个请求,这是特定视图/页面的第一个请求。例如,对于下面的测试,该应用程序已运行数小时,并不断收到请求,但测试捕获了该视图的第一个请求。

第一个请求

Capture of MiniProfiler

第二请求

enter image description here

+0

可能重复http://stackoverflow.com/questions/13794580/mvc-asp -net-startup-time-revisited) – 2014-09-03 05:26:55

+0

唉,我不知道这是否有任何答案。 ASP.NET MVC Web应用程序第一次启动时,通常需要大约5秒的时间。预编译视图似乎没有任何影响。我从未见过微软真正的答案。 – 2014-09-03 05:28:13

+1

@RowanFreeman这不是AppDomain/Web应用程序的第一个请求,而是特定视图/页面的第一个请求。我在这个问题上已经说得更清楚了。 – 2014-09-03 12:04:22

回答

0

奇怪!为了100%地确定到底发生了什么,但我会做到以下几点:

  1. 我会重定向运行时编译(是的,就会有一个,因为在 至少全球。 ASAX需要编译)是这样的:

    <system.web> 
        <compilation debug="true" targetFramework="4.5" tempDirectory="c:\temp\asp.net" /> 
        ... 
    </system.web> 
    
  2. 我之前和 第一次运行后调查文件夹的内容。也许有一个原件的副本会更好。

从你好像一切问题的描述应该是蛮好的,有将是运行之间没有差异。还比较文件夹前后的内容可能会显示出一些差异。

另一个原因可能是一些缓存,但我可以猜测你已经对它进行了排序。

+0

这里不应该有运行时编译 - 我们的MVC应用程序是预编译的,不可更新,因此也没有global.asax,因为它也是编译好的。然而,我会试一试,看看。另一个调查的目的是查看是否有不同的编译选项(Debug vs release vs PDB等)在这里起作用。 – 2015-09-16 02:57:52

+0

让我们回顾一下这个问题是什么:第一次运行比以下任何一个都慢很多,对吧?如果是这样,原因或者是在第一次运行之前进行了一些准备工作,那就是编译,或者准备第二次,第三次等更快的运行,比如缓存。我不希望这种构建,调试或发布会影响这一点。 – 2015-09-16 04:11:07

+0

而且,也许你会想在IL代码JIT编译中注意。尽管速度非常快,但至少会发生一次,即在首次调用一段代码之前。尽管如此,在渲染阶段还是有这么大的差别(尽管渲染阶段是“纯粹”渲染还是渲染其他东西)不太可能是原因。 – 2015-09-16 04:16:38

0

我在几个月的时间里遇到了同样的问题:它只发生在某些视图上。

显然,视图的渲染并不像我想的那么简单,因为MVC需要运行一些操作来确定用于动作的确切.cshtml,如果您有任何等等,它的部分视图等。

什么做的工作对我来说是使用Razor Generator过程剃刀文件在设计时,而不是运行的。 (如果你想给它一个镜头,我建议首先尝试一下,你知道在第一次尝试时需要时间加载)。

从网站:

这么做的原因之一,这是为了避免任何运行时命中当你的网站 开始,因为没有什么留给在运行时编译。这可以是 在有很多视图的网站中很重要。

实施剃刀发电机的缺点是,你不再需要.cshtml文件:所以,如果你想改变一个观点,你必须重新编译该项目。但这不是问题,至少不适合我。

首先从VS扩展库安装剃须刀发生器(就像它在网站上解释的那样),然后是nuget包。

相信我:你会如此放心你快哭了☺的[再访MVC ASP.Net启动时间(

+0

那么Razor Generator如何在aspnet视图编译和合并中不做这项工作?你有没有试过使用内置的设计时间复杂性工具? – 2016-05-20 13:24:16

+0

RazorGenerator允许在设计时处理Razor文件而不是运行时,允许将它们内置到程序集中以简化重用和分发。 关于“编译”有一个混淆:当你设置 true时,你实际上告诉编译器只检查视图中的错误:不同之处在于RazorGenerator包含一个.cs类每个视图(或者只有你想要的视图)作为编译程序集的一部分:所以基本上你要保存MVC的工作来第一次解释每个视图。 你指的是哪个编译工具? – Silvestre 2016-05-20 14:21:00

+0

我们通过发布配置文件构建视图,该配置文件设置为在发布模式下将所有视图构建到单个装配中。视图文件已部署,但只是预复杂工具生成的标记文件。我们命名为Web.Site.Pages.dll的单个程序集的大小为5MB,使用Reflector可以看到ASP名称空间内的所有已编译视图类。该程序集与每个视图的* .compiled文件一起放置在bin目录中。那就是说,RazorGenerator在这里有什么不同? – 2016-05-23 17:52:46