[解決済み] Visual Studioのデバッグ/ロードが非常に遅い
質問
途方に暮れています。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が生成するログファイルは、各シンボルの読み込みに約200msかかるのです。したがって、超長時間の遅延が発生します。
試してみたこと
- デバッグ版でもリリース版でもかまいません。
- 私のプロジェクトをウェブサーバー上の完全なIIS実装に置くと、何の問題もなく超高速で動作します。
- Cassini、IIS Express 7.5、IIS Express 8.0のいずれでも問題が発生します。
- すべてのブレークポイントを削除しても何も起こりません。
- クリーンソリューション や、.suoを削除しても、何も起こりません。
-
IIS Expressを修復する、または
My Docs\IISExpress
フォルダを削除したり、Visual Studio を修復/再インストールしたりすると、問題は解決するかもしれませんが、しばらくの間だけで、すぐに再発します。
何かアドバイスがあれば、よろしくお願いします。
より多くの質問に答えるために、はい、私のマシンは確かに馬力があります。腹立たしいことに、何も変更していない同じプロジェクトが、IIS Expressを修復して
My Docs\IISExpress
フォルダーに格納されます。結局、quot;something" が起こり、再びロードするのに2分かかるようになりました。私が取り組んでいるのは、複雑なプロジェクトではありません。外部ライブラリや依存関係はなく、私のVS.NETにはアドオンは一切ありません。
このマシンにはSymantec Endpoint Protectionが搭載されていますが、これは大惨事を引き起こした過去があります。しかし、それを完全に無効にしても(管理者であることは良いことです)、問題は解決しませんでした。
この時点で仮説があります。ネットワーク共有のリダイレクトされたフォルダーで作業しているからだと思うのです。デバッガが何百もの "loaded symbols" 行を通過している間、私は一時停止してそれが何をしているのか確認しました。それは私のコードの中にあり、私が持っている 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は再びファイルを再コンパイルしています。しかし、あくまで仮説であり、実際には何の手がかりもありません。
ひとつは、どうやらオフラインのファイルが入っているようなのです(これはオフィスのデスクトップパソコンなので、気にすることはありません)。明日、無効にして再起動し、再試行するつもりです。
さらに、私のプロジェクトをそのまま、ローカルのC:に移動させると直りました。読み込みがとても速くなりました。しかし、これは作業環境としては理想的ではありません。前バージョンが失われ、手動でコピーしない限り私のコードはまったくバックアップされず、もはや誰とも共有されないのです。
いざとなったらCからネットワーク共有にコピーして往復すればなんとかなる。ページ読み込みのたびに2分も待たされる方がよっぽど迷惑だ。
解決方法は?
Visual Studio 2012で、シンボルの読み込みが遅い問題を解決した方法を紹介します。
-
ツール -> オプション -> デバッグ -> 一般 を選択します。
-
Enable Just My Code"の横にあるチェックマークをオンにします。
-
ツール -> オプション -> デバッグ -> シンボル に移動します。
-
ボタンをクリックし、ローカル コンピュータのどこかにキャッシュされたシンボルを保存するための新しいフォルダを作成または選択します。私は "Symbol caching" と名付け、Documents -> Visual Studio 2012 に置きました。
-
"すべてのシンボルを読み込む"をクリックし、マイクロソフトのサーバーからシンボルがダウンロードされるのを待ちます(しばらく時間がかかる場合があります)。 Load all symbolsボタンはデバッグ中のみ有効ですのでご注意ください。
-
Visual StudioがリモートでMicrosoftサーバーに問い合わせるのを防ぐために、"Microsoft Symbol Servers"の横のチェックマークをオフにします。
-
OK"をクリックします。
これからは、シンボルの読み込みがより速くなるはずです。
Microsoft アセンブリに何らかの変更/ダウンロードを行った場合、[シンボル] ダイアログ ボックスに戻って "Load all symbols" を再度実行する必要があるかもしれないことに注意してください。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】VS 2015でコントローラからビューを追加できない : "選択されたコードジェネレータの実行にエラーが発生しました"
-
[解決済み] ASP.NET MVC ビューエンジンの比較
-
[解決済み】Visual Studioでコードを自動フォーマットする方法とは?
-
[解決済み】ASP.NET MVC 3 - 部分テンプレートと表示テンプレートと編集テンプレート
-
[解決済み】Java Server Faces 2.0の主なデメリットは何ですか?
-
[解決済み】AutoMapper.CreateMapsをどこに配置するか?
-
[解決済み] セキュリティ透過的なメソッド 'WebMatrix.WebData.PreApplicationStartCode.Start()' による試行。
-
[解決済み] HTMLヘルパーでURLを生成する
-
[解決済み] ASP.NET MVC 1でHttpContextBaseからHttpContextオブジェクトを取得するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Razor View Engine : 式ツリーには、動的な操作を含めることができません。
-
[解決済み] Visual Studio 2015の動作が極端に遅い
-
[解決済み】ASP.NET mvcとIISでURLのドットが原因で404になる
-
[解決済み】MVCアプリケーションでデータをキャッシュする方法
-
[解決済み】ASP.NET MVCのルートをサブドメインに基づいて作成することは可能ですか?
-
[解決済み] MVCのHTMLヘルパーで生成されたHTML要素にclass属性を追加するにはどうすればよいですか?
-
[解決済み] ASP.NET MVCコントローラから外部URIへのリダイレクト
-
[解決済み] mvc 4 で部分ビューにパラメータを渡すにはどうすればよいですか?
-
[解決済み] Visual Studio 2012 または Visual Studio 2013 で古い MVC プロジェクトを開くにはどうすればよいですか?
-
[解決済み] NerdDinnerでASP.NET MVCでModelState.IsValidは何のために有効なのか?