2014-09-03 2 views
5

뷰가 미리 컴파일되어 단일 어셈블리로 병합 된 MVC 5.x 앱이 있습니다. AppDomain을 시작한 후 첫 번째 요청이 AppDomain 시작 후 느려지더라도 뷰가 처음 요청 될 때 느려지므로 어느 뷰가 요청되는지는 중요하지 않습니다. MiniProfiler로 파고 들자면 대부분의 시간을 소요하는 뷰의 "Render"시간이며 뷰에 추가 요청이있을 때 렌더링 시간은 약 90 % 감소합니다. 따라서 시간의 할당량을 차지하는 첫 번째 렌더입니다. 사실 모든 뷰가 미리 컴파일되어 있기 때문에이 속도가 느려지는 것을 기대하지 않았습니다. JIT가이 대규모의 속도를 늦추는 원인이라고 믿지 않습니다. 아무도 추측이나 통찰력을 갖고 있지 않습니까?컴파일 된 MVC 뷰가 처음 요청시 천천히 렌더링됩니다.

이것은 웹 응용 프로그램의 첫 요청이 아니며, 특정보기/페이지의 첫 번째 요청임을 유의하십시오. 예를 들어, 아래의 테스트에서 앱은 몇 시간 동안 실행되어 요청을 끊임없이 가져 왔지만 테스트에서는이보기에 대한 첫 번째 요청을 캡처했습니다.

첫 번째 요청

enter image description here

+0

가능한 중복 ☺ http://stackoverflow.com/questions/13794580/mvc-asp -net-startup-time-revisited) –

+0

아아아, 이것이 어떤 대답이 있는지 나는 모른다. ASP.NET MVC 웹 응용 프로그램이 처음 시작될 때 대개 약 5 초가 걸립니다. 뷰를 미리 컴파일해도 효과가없는 것 같습니다. 나는 마이크로 소프트에 의해 이것에 대한 진정한 대답을 본 적이 없다. –

+1

@RowanFreeman 이것은 AppDomain/web 응용 프로그램의 첫 번째 요청이 아니라 특정보기/페이지의 첫 번째 요청입니다. 나는이 질문을 더 분명하게했다. –

답변

0

이상한

Capture of MiniProfiler

두 번째 요청! 정확히 무슨 일을 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 PDB 등)이 여기서 어떤 역할을하는지 확인하는 것입니다. –

+0

이 이슈가 무엇인지 기억해보십시오 : 첫 번째 실행은 다음의 것들보다 훨씬 느립니다. 맞습니까? 그렇다면 이유는 첫 번째 실행 전의 준비 과정, 즉 컴파일 또는 더 빠른 두 번째, 세 번째 등의 실행 준비, 즉 캐싱에 있습니다. 내가 그 유형의 빌드, 디버그 또는 릴리스,이 영향을 미칠 것이라고 기대하지 않을 것이다. –

+0

또한 IL 코드 JIT 컴파일시주의를 기울이고 싶을 수도 있습니다. 매우 빠르지 만 코드가 처음 호출되기 전에 적어도 한 번 이상 발생합니다. 그래도 이러한 큰 차이점과 렌더링 단계에서 ("순수한"렌더링이든 렌더링이 다른 것 인간에) 원인이되지는 않습니다. –

0

몇 달 동안 똑같은 문제로 고민했습니다. 일부보기에서만 나에게 일어났습니다.

분명히, MVC는 동작을 위해 정확한 .cshtml을 결정하기 위해 몇 가지 작업을 실행해야하므로보기의 렌더링이 생각보다 간단하지 않습니다. . 나를 위해 일을했다 무엇

디자인 타임에 대신 런타임의 Razor Generator하는 프로세스 면도기 파일을 사용하는 것입니다. (만약 당신이 그것을 포기하고 싶다면 처음 시도 할 때로드하는 데 시간이 걸린다는 생각으로 먼저 시도해보십시오.) 웹 사이트에서

:이 작업을 수행하는

한 이유가 아무것도없는 런타임에 컴파일 떠난 사이트 시작하는 런타임 히트를 방지하는 것입니다.많은 조회수가있는 사이트에서이 값은 일 수 있습니다. 그래서 당신은보기를 변경하려는 경우, 프로젝트를 다시 컴파일해야 :

면도기 발전기을 구현의 단점은 더 이상 .cshtml 파일이 필요 없다는 것입니다. 그러나 적어도 필자에게는 그렇지 않다.

VS 확장 갤러리에서 먼저 (웹 사이트에서 설명한 것처럼) Rugor Generator를 설치 한 다음 Nuget 패키지를 설치하십시오.

신뢰 나 : 당신이 거 그래서 당신이 울 거있어 안심이 될 수있다 [재검토 MVC ASP.Net 시작 시간] (의

+0

그래서 Razor Generator는 내장 된 aspnet view 컴파일과 병합이이 작업을 수행하지 않는다는 것을 어떻게합니까? 내장 된 디자인 타임 도구를 사용해 보셨습니까? –

+0

RazorGenerator는 런타임 대신 디자인 타임에 Razor 파일을 처리 할 수 ​​있으므로 어셈블리를보다 쉽게 ​​재사용하고 배포 할 수 있도록 어셈블리에 내장 할 수 있습니다. "컴파일"과 관련하여 혼란이 있습니다.' true'를 설정하면 실제로 컴파일러에서 뷰의 오류를 확인하도록 지시하고 있습니다. 차이점은 RazorGenerator에는 .cs 클래스 컴파일 된 어셈블리의 일부로 각보기 (또는 원하는보기 만) : 기본적으로 MVC의 작업을 저장하여 처음으로 각보기를 해석합니다. 어떤 컴파일 도구를 사용하고 있습니까? – Silvestre

+0

릴리스 모드의 단일 어셈블리에 모든 뷰를 작성하도록 설정된 게시 프로파일을 통해 뷰를 빌드합니다. 뷰 파일은 배치되었지만 사전 복잡 툴링에 의해 생성 된 마커 파일 일뿐입니다. Web.Site.Pages.dll이라는 이름의 단일 어셈블리는 크기가 5MB이고 Reflector를 사용하면 ASP 네임 스페이스 내의 모든 컴파일 된 뷰 클래스를 볼 수 있습니다.이 어셈블리는 각보기에 대한 * .compiled 파일과 함께 bin 디렉토리에 저장됩니다. 그렇다면 RazorGenerator는 어떻게 다릅니 까? –

관련 문제