私は機知に富んでいます。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# と Razor です。
症状:
システムはシンボルを何百回もロードします。基本的には次のとおりですが、そのような行が少なくとも 300 行あり、それぞれ同じ CSHTML に対してわずかに異なる 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.
上記では、「Contact」、「Location」、「StatusCode」の 3 つの DisplayTemplates があります。表示テンプレートが呼び出されるたびに、IIS がシンボルを 2 回ロードしているようです。したがって、これら 3 つの表示テンプレートすべてを呼び出す 100 エントリのテーブルを表示すると、600 個の個別のシンボルが読み込まれます。
これも高速な操作ではありません。IIS が生成するログ ファイルは、各シンボルを読み込むのに約 200 ミリ秒かかります。したがって、非常に長い遅延。
私が試したこと:
- デバッグ バージョンまたはリリース バージョンは関係ありません。
- プロジェクトを Web サーバー上の完全な IIS 実装に配置すると、問題なく超高速で実行されます。
- Cassini、IIS Express 7.5、および IIS Express 8.0 のすべてに問題があります。
- すべてのブレークポイントを削除しても何も起こりません。
- Clean Solution、または .suo を削除しても何もしません。
- IIS Express を修復するか、フォルダーを削除するか、
My Docs\IISExpress
Visual Studio を修復/再インストールすると、問題が解決する場合がありますが、問題がすぐに再発するまでしばらくの間だけです。
どんなアドバイスでも大歓迎です。
さらに質問に答えると、はい、私のマシンには間違いなく馬力があります。My Docs\IISExpress
腹立たしいことは、通常、IIS Express を修復してフォルダーを削除した後、何も変更されていない同じプロジェクトが非常に速く読み込まれることがあることです。最終的に、「何か」が発生し、再度ロードするのに 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 は、呼び出されるたびに表示テンプレートを再コンパイルしているように見えますが、これも何百回も行われています。私の理論では、Visual Studio がファイルをコンパイルしてネットワーク共有に保存し、何らかの方法で新しい時刻をスタンプすると、Visual Studio はファイルが変更されたと認識します。したがって、Visual Studio はそれをもう一度再コンパイルします。ただし、理論にすぎません。私は本当に手がかりがありません。
1 つには、どうやら私はオフライン ファイルを持っているようです (これはオフィスのデスクトップ コンピューターです。あまり気にしませんでした)。明日、無効にして再起動し、再試行します。
さらに、プロジェクトをそのままローカル C: に移動すると、問題が修正されます。それは非常に速く読み込まれます。しかし、これは職場環境では理想的ではありません。以前のバージョンを失いました。手動でコピーしない限り、コードはまったくバックアップされず、誰とも共有されなくなりました。
必要に応じて、C からネットワーク共有にコピーするだけで十分です。ページが読み込まれるたびに 2 分間待つのは、さらに面倒です。