asp.net mvc - 최적화 - Visual Studio 디버깅/로드 속도가 매우 느림




visual studio 빌드 속도 (20)

"Temporary ASP.NET Files"폴더를 삭제하고 localhost 페이지로드가 크게 향상되었습니다. 다음은 경로입니다 ... % temp % \ Temporary ASP.NET Files \

나는 재치가있다. Visual Studio는 일반적으로 ASP.NET MVC 사이트를 디버깅하거나 단순히로드 ( "디버깅하지 않고 시작")하기가 상당히 힘듭니다. 항상 그런 것은 아닙니다. 처음에는 프로젝트가 멋지고 빠르게로드되지만로드가 느린 경우로드 후에는 항상 느리게로드됩니다. 나는 1 ~ 2 분 이상 기다릴 수 있었다.

내 설정 :

현재 Visual Studio 2012 Express 를 사용하고 있지만 Visual Studio 2010 Express에서도 동일한 문제가 발생했습니다. 내 솔루션은 네트워크 드라이브에 저장됩니다. 특히 중요한 경우 네트워크 드라이브로 리디렉션되는 내 문서입니다. 이 설정에서는 내 사이트가 매우 빠르게로드되는 경우가 있습니다.

보통 Internet Explorer 9에서로드되지만 Firefox에서 같은 문제가 발생합니다.

이것은 내가 작업하는 모든 ASP.NET MVC 프로젝트에서 발생할 수 있으며, 모든 ASP.NET MVC 프로젝트가 수행하는 DisplayTemplates를 중심으로 돌아가는 것처럼 보입니다. 그리고 그것이 중요하다면 모두 C #과 면도기입니다.

조짐:

시스템은 내 기호를 수백 번로드합니다. 기본적으로, 다음과 같은,하지만 적어도 300 같은 행, 각 CSHTMLs에 대한 약간 다른 DLL 파일이 있습니다 :

'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.xighmhow.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.cv5hktkf.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.1o77hs8i.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.jja-77mw.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.l_e9ev_s.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.b4n59gom.dll', Symbols loaded.

위의 세 가지 DisplayTemplates : "Contact", "Location"및 "StatusCode"가 있습니다. displaytemplate이 호출 될 때마다 IIS가 기호를 두 번로드하는 것으로 보입니다. 따라서이 세 가지 displaytemplates를 모두 호출하는 100 개 항목의 표를 표시하면 600 개의 개별 기호가로드됩니다.

이것은 빠른 작업이 아닙니다. IIS가 생성하는 로그 파일을 보면 각 심볼이로드되는 데 약 200ms가 걸립니다. 따라서, 매우 긴 지연.

내가 시도한 것 :

  • 디버그 또는 릴리스 버전, 그것은 중요하지 않습니다.
  • 내 프로젝트를 웹 서버의 전체 IIS 구현에 적용하면 문제없이 매우 빠르게 실행됩니다.
  • Cassini, IIS Express 7.5 및 IIS Express 8.0에는 모두 문제가 있습니다.
  • 모든 중단 점 삭제는 아무 작업도 수행하지 않습니다.
  • Clean Solution 또는 .suo를 삭제해도 아무 일도하지 않습니다.
  • IIS Express를 복구하거나 My Docs\IISExpress 폴더를 삭제하거나 Visual Studio를 복구 / 재설치 한 경우 문제가 바로 해결 될 수 있습니다.

모든 조언을 주시면 감사하겠습니다.

더 많은 질문에 답하기 위해, 예, 제 기계는 확실히 마력을 가지고 있습니다. 분노한 것은 같은 프로젝트가 아무런 변화없이 IIS Express를 복구하고 My Docs\IISExpress 폴더를 삭제 한 후에 매우 빠르게로드 될 수 있다는 것입니다. 결국 "무언가"가 발생하고 2 분이 지나면 다시로드됩니다. 내가하고있는 일은 복잡한 프로젝트가 아닙니다. 외부 라이브러리 또는 종속물이 없으며 VS.NET에 추가 기능이 없습니다.

참고로,이 시스템에는 혼란을 야기한 Symantec Endpoint Protection이 있습니다. 그러나 그것을 무조건적으로 비활성화하면 (관리자가되는 것이 좋음) 문제를 해결하지 못했습니다.

나는이 시점에서 이론을 가지고있다. 네트워크 공유에서 리디렉션 된 폴더를 사용하고 있기 때문에 이것이 모두라고 생각합니다. 디버거가 수백 개의 "로드 된 심볼"라인을 통과하는 동안, 나는 그것이 무엇을했는지보기 위해 멈추었습니다. 그것은 내 코드에서 내가 가지고있는 DisplayTemplate을로드하는 것입니다. 템플리트에 들어가면 다음과 같이 출력됩니다.

Step into: Stepping over non-user code 'System.Threading.WaitHandle.InternalWaitOne'
Step into: Stepping over non-user code 'System.Threading.WaitHandle.WaitOne'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCapture'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromFileBatch'
Step into: Stepping over non-user code 'System.Web.Compilation.AssemblyBuilder.Compile'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.bciuyg14.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.CompileWebFile'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultInternal'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.Find'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.ActionCacheViewItem.Execute'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.kwj3uqan.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.RuntimeType.CreateInstanceSlow'
Step into: Stepping over non-user code 'System.Web.Mvc.DependencyResolver.DefaultDependencyResolver.GetService'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerCompiledView.Render'

Visual Studio가 호출 될 때마다 내 displaytemplate을 다시 컴파일하는 것처럼 보입니다. 다시 말하면 수백 번입니다. 내 이론은 Visual Studio가 파일을 컴파일하고 네트워크 공유에 저장 한 다음 네트워크 공유가 어떻게 든 새 시간에 스탬프를 찍고 Visual Studio에서 파일이 변경된 것으로 생각하여 Visual Studio에서 다시 컴파일합니다. 이론 만; 나는 정말로 단서가 없다.

하나는 분명히 오프라인 파일이 있습니다 (이 파일은 사무실의 데스크탑 컴퓨터이며 덜 신경 쓸 수는 없습니다). 나는 내일 재부팅하고 재부팅을 해제 할 예정이다.

게다가, 내 프로젝트를 그대로 C :로 옮겨서 수정합니다. 매우 빠르게로드됩니다. 그러나 이것은 작업 환경에서 이상적이지 않습니다. 이전 버전을 놓치고 수동으로 복사하지 않으면 코드가 전혀 백업되지 않으며 더 이상 다른 사람과 공유하지 않습니다.

C에서 네트워크 공유로 앞뒤로 복사 할 수 있습니다. 모든 페이지가로드 될 때까지 2 분을 기다리는 것이 훨씬 더 성가시다.


FusionLog를 활성화 했습니까?

VisualStudio는 디버깅을 시작할 때 솔루션 시작 및로드가 매우 느립니다. 내 컴퓨터에서만 느리지 만 다른 컴퓨터에서는 느려지지 않았습니다.

FusionLog는 수 많은 로그 항목을 디스크에 씁니다. 제 경우에는 RegEdit에서 모든 것을 해결했습니다.

이것은 레지스트리에있는 FusionLog 키입니다 :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion

ForceLog 값을 확인하십시오 (1 활성화, 0 비활성화).


Windows 탐색기에서 솔루션 폴더를 열고 Visual Studio를 닫고 Windows 탐색기에서 .suo 파일을 삭제하십시오.

이제 Visual Studio에서 프로젝트를 열면 디버거가 빠르게 연결 / 분리됩니다.


intelliTrace를 끄면이 문제가 해결되었습니다.

Visual Studio에서 도구 -> 옵션 -> IntelliTrace

그런 다음 "IntelliTrace 사용"확인란의 선택을 취소하십시오.


나는 같은 문제를 경험하고 위의 결의 대부분을 시도했다. 단순히 캐시 및 임시 파일을 삭제하면 결국 나를 위해 일합니다.

다음 두 폴더의 내용을 제거하십시오.

C:\Users\\{UserName}\AppData\Local\Microsoft\WebsiteCache

C:\Users\\{UserName}\AppData\Local\Temp (특히 iisexpress 및 Temporary ASP.NET Files 폴더).

C:\Users\\{username}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 폴더에 다음 내용으로 cmd 파일을 추가하여 Windows에 로그온 할 때 자동으로 실행되도록 설정할 수 있습니다.

rmdir C:\Users\\{username}\AppData\Local\Microsoft\WebsiteCache /s /q

rmdir C:\Users\\{username}\AppData\Local\Temp /s /q

나는 디버깅과 함께 실행 퍼포먼스 문제도 있었고 디버거의 많은 옵션을 시도했다. 내 경우에는 거대한 성능이 내가이 옵션을 변경 달성 :

도구 - 옵션 - 디버깅 - 출력 창 - (일반 출력 설정 - 모든 디버그 출력) - 꺼짐


나를 위해 IE 9.08.8112.16241했습니다. Firefox 나 Chrome을 사용하자마자 F10이나 F11에서 디버깅이 느려지지 않았습니다. 나는 IE의 문제점이 무엇인지 모르지만 나는 공식적으로 그것을 테스트에 사용하는 것을 경멸한다.

업데이트 : 모든 IE 프로그램 추가 기능을 해제했으며 전체 속도로 돌아 왔습니다. 한 번에 하나씩 돌리면 LastPass (내 경우에는)가 범인이라는 것이 밝혀졌습니다. 결국 MS를 비난하지는 않을 것입니다.


내 경우에는

Tools/Options/Debugging/General/Enable JavaScript debugging for ASP.NET (Chrome and IE)

이 선택을 취소하면 디버그 시작 시간이 45-60 초에서 0-5 초로 줄어 들었습니다.


다음은 Visual Studio 2012에서 "느린 기호로드"문제를 해결 한 방법입니다.

  • 도구 -> 옵션 -> 디버깅 -> 일반으로 이동하십시오.

  • "내 코드 만 사용"옆의 체크 표시를 선택하십시오.

  • 도구 -> 옵션 -> 디버깅 -> 기호로 이동하십시오.

  • "..."버튼을 클릭하고 캐시 된 기호를 저장하기 위해 로컬 컴퓨터의 어딘가에 새 폴더를 만들거나 선택하십시오. 내 이름을 "Symbol caching"으로 지정하고 문서 -> Visual Studio 2012에 넣습니다.

  • "모든 심볼로드"를 클릭하고 Microsoft 서버에서 심볼이 다운로드 될 때까지 기다리십시오. 시간이 소요될 수 있습니다. 모든 심볼로드 버튼은 디버깅 중에 만 사용할 수 있습니다.

  • Visual Studio가 Microsoft 서버를 원격으로 쿼리하지 못하게하려면 "Microsoft Symbol Servers"옆의 확인 표시를 클릭하십시오.

  • "확인"을 클릭하십시오.

이제부터는 심볼 로딩이 훨씬 빨라야합니다.

Microsoft 어셈블리를 변경 / 다운로드하는 경우 Symbols 대화 상자로 돌아가서 "모든 심볼로드"를 다시해야 할 수도 있습니다.


드디어 이유를 알 수 있을지 모르지만 이유는 알지 못합니다. 문제가 다시 발생하기 시작했을 때, 나는 고아 인 "conhost.exe"프로세스를 발견했습니다. 나는 Visual Studio를 닫을 것이고 그들은 열려있을 것이다. 각각의 작업을 끝내면 마침내 문제가 안정적으로 해결됩니다. [희망]

(conhost.exe는 Visual Studio 프로세스가 아니기 때문에 conhost.exe를 실행하는 다른 응용 프로그램이있을 수 있습니다. 내 컴퓨터가 내가 할 수없는 이유를 알고 있습니다. YMMV를 제외한 모든 작업을 안전하게 종료하십시오.)

왜 이런 일이 일어나는가? 한 번에 두 개 이상의 프로젝트를 열 때 발생하는 것처럼 보입니다. 저는 자주하는 경향이 있습니다. 언제든지 한 프로젝트 만 빌드하고 디버깅 할 수 있습니다.

편집 # 1 - 불행히도 "은색 총알"이 아닙니다. 그것은 항상 나를 위해 작동하지 않습니다. 일반적으로 작업이 느려지면 모든 Visual Studio 세션을 닫은 다음 작업 관리자로 가서 그 인스턴스 인 conhost.exe, iisexpress.exe Microsoft.VisualStudio.Web.Host.exe 및 MSBuild.exe를 종료하십시오. 내가 찾을 수 있습니다.

일반적으로 그 후에 프로젝트를 다시 시작하면 빠르게로드됩니다. 하지만 항상 그런 것은 아닙니다.

정말로 최선의 행동 방침은 리디렉션 된 폴더 / 네트워크 공유에서 코드를 작성 및 디버그하지 않는 것입니다.

# 2 편집 - 2 년 후, Visual Studio Community 2013에서 여전히 문제가되었지만 최소한 Explorer.exe 라는 범인 작업을 찾은 것 같습니다. 그래, 누가 알았어. 그 작업을 끝내자, bam은 페이지를 1 초 만에로드합니다.

Windows 탐색기 파일 브라우저가 리다이렉트 된 네트워크 드라이브 (보통 코드가있는 곳이기 때문에)에 열려 있으면이 문제가 발생하는 것 같습니다. 창을 닫는 것만으로는 충분하지 않습니다. 전체 Explorer.exe 작업을 종료해야합니다. 나는 그것이 무엇을하고 있는지를 짐작할 수 있습니다 ... 파일 핸들을 가지고 견과를 갈 생각입니까?

일반적으로 작업 관리자를 사용하여 새로운 explorer.exe 작업을 시작할 수 있습니다 (단, 많은 Alt-Tabbing 만 사용할 수 있습니다). Visual Studio는 멋지고 빠르게로드 할 것입니다. 그러나 필자가 Windows 탐색기를 다시 열면 거의 항상 초 저속 모드로 돌아갑니다.

따라서, 만약 당신이 방향 전환 된 네트워크 공유를 가지고 있다면, 한 발을 내놔. 그것은 지역에서 일하는 것이 분명합니다.


심볼 캐시 비우기는 나를 위해 일했습니다.

참조 : 메뉴 바 / 도구 / 옵션 / 디버깅 / 심볼 / 빈 심볼 캐시


아직이 문제가 발생했는지는 모르겠지만 Visual Studio에서 사이트를 디버깅하려면 디버거를 VS에 연결하지 않고 프로세스 자체에 연결하여 시간을 크게 개선해야합니다. 내가 AttachTo라는 VS 확장을 사용하고 here 내가 어떻게 사용하는지에 대한 작은 기사가 here .

이게 도움이 되길 바란다.


위의 모든 작업을 수행 한 후에 나를 위해 일한 한 가지는 다음과 같습니다.
Threads 창 (Debug-> Windows-> Threads)에서 Group by를 None으로 설정하십시오. 이것은 디버깅 중에 만 수행 할 수 있습니다.

이 창을 닫은 후에도 영향을 미치고있었습니다.


이 중 아무 것도 나를 위해 일한지만 삭제 된 기호에 중단 점을 발견했습니다. 2010 년은 그것에 매달려 있었다. 이것이 문제인지 확인하려면 debug-> windows-> breakpoints가 있으면 거기에있는 것이 있으면 삭제하십시오.

손더스는 그가 그것을 점검했다고 언급했지만이 문제에 대한 해결책에는 언급되지 않았습니다. 어쩌면 우리 모두는 아니지만 일부는 공통 지식 일 수 있습니다.


제 경우에는 VS 2012의 .NET Reflector Visual Studio Extension (버전 8.3.0.93)이었습니다. 디버깅은 각 Step Over (F10)마다 10 초가 걸렸습니다.

Visual Studio에서 Tools / Extensions and Updates ... 로 이동하여 .NET Reflector Visual Studio Extension을 비활성화합니다. Visual Studio를 다시 시작하는 것을 잊지 마십시오.


제 경우에는 인터넷 연결을 비활성화하면 ctrl-f5와 같이 빠르게 실행되므로 디버그 -> 옵션 -> 기호로 가서 모든 .pdb 위치의 선택을 취소 한 것으로 나타났습니다.

VS가 디버그 세션이 시작될 때마다 이러한 서버에 연결하려고하는 것처럼 보입니다.

디버그 -> 옵션 -> 디버깅 -> 일반 "원본 지원 사용"또는 "원본 파일이 원본 버전과 정확히 일치하도록 요구"를 사용하지 않도록 설정해도 아무런 차이 가 없습니다 .


필자는 기본적으로 web.config의 컴파일 태그에 다음 두 가지 속성을 추가하여 성능을 크게 향상시킨 이 팁 을 구현 했습니다.

<compilation ... batch="false" optimizeCompilations="true"> ... </compilation>

batch = "false"는 무엇을합니까?

변경되고 다시 컴파일해야하는 페이지 만 컴파일하여 사전 컴파일을보다 선택적으로 만듭니다.

optimizeCompilations는 정확히 무엇을 수행합니까? Source

ASP.NET은 bin 및 App_Code 폴더와 global.asax를 포함하여 여러 가지 상태를 포함하는 응용 프로그램 별 해시 코드를 사용합니다. ASP.NET 응용 프로그램 도메인이 시작될 때마다이 해시 코드가 이전에 계산 된 것과 바뀌 었는지 확인합니다. 그렇다면 전체 codegen 폴더 (컴파일되고 섀도 복사 된 어셈블리가있는 곳)가 지워집니다.

이 최적화가 활성화되면 (optimizeCompilations = "true"를 통해) 해시에서는 더 이상 bin, App_Code 및 global.asax를 고려하지 않습니다. 결과적으로 이러한 변경이있을 경우 codegen 폴더가 없어지지는 않습니다.

참조 : msdn의 컴파일 요소


하루 종일 기호를 기다리는 동안 거북이 속도가 느려지고, 내 코드 만, 캐싱 기호 , Intellitrace , Just-In-Time, kill 프로세스 등 모든 조합을 혼합하고 전환합니다.

내 솔루션은 실제로 바이러스 백신해제하는 것이 었습니다. 예, Windows Defender가 프로젝트 시작 속도를 늦추고있었습니다. Visual Studio에서 요청한 모든 DLL을 검사하여 전체 심볼로드 프로세스 속도를 느리게했습니다.

우리 머신에는 솔루션을 정말 빨리 컴파일 할 수있는 좋은 스펙이있어서 문제가되지는 않습니다. VS 2013 Ultimate에서 코딩합니다.


"원시 코드"디버거 를 사용할 때 Visual Studio 디버깅에 문제가있었습니다. 비활성화하십시오.

"Visual Studio 2012"에서 다음으로 이동하십시오.

  1. 프로젝트 속성 ->
  2. 웹 ->
  3. 디버거 (페이지 하단). ->
  4. ASP.NET을 제외한 모두 사용 안 함

희망이 도움이됩니다.

비슷한 질문 : 1 , 2


브라우저 링크 를 비활성화하여 저속 VS 문제가 해결되었습니다.





cassini