2011-12-09 1 views
4

剃刀の表示を変更したり、再コンパイルしたり、15〜20分待つと、最初のヒットでレンダリングするのに3〜20秒かかることがあります。変更後にビューを再コンパイルする必要があることを理解しています。私はまた、アプリケーションが一定期間活動しなくてもアンロードされることを理解していますが、最初のヒットでは1回限りのペナルティになると思いました。しかし、私にとっては、すべての単一のページに適用されるようです。各ページの最初のヒットでASP.Net MVC3のパフォーマンスを向上させるにはどうすればよいですか?

私のホームページを例にとります。 YSlowによると、コンポーネントが15個あり、重量が250K(これはMiniProfilerの追加jqueryリファレンスを含む)の「B」です。 MiniProfilerから、私は最初の行(http:// localhost:80)で約500msを見ます。私はこれがビューのコンパイルを含むと仮定しています。しかし、私はFind:Indexのために1200msを見ます。 SQLコールはありません。最初のヒット時の合計ロード時間は約3000msで、その後のヒット数は約40msです。

いくつかの部分的なビューを持つ別のページでは、親ビューは「検索」に2400msかかります。部分ビューの1つには1000msがかかります。親ビューはレンダリングに3200msかかります。そして、最大の影響は、7000msという、最初の行(http:// localhost:80/User/Dashboard)にあります。このページには3つのクエリだけがあり、合計クエリ時間は100msです。総負荷時間は15000ms以上です。後続のヒットは約250msです。

セットアップはASP.Net MVC 3、Ninject、EF4.2、Razorビューエンジン、ELMAH、NLog、Html5Boilerplate、およびMvcMiniProfilerです。私は重複プロジェクトを作成し、Ninject、ELMAH、NLog、およびMvcMiniProfilerを削除しました。パフォーマンスはほんのわずかでした。 1つの領域に約15台のコントローラと約40のビューがあります。

この正常なパフォーマンスですか? Azureにデプロイすると、ローカルでのテストよりも(自然に)悪化します。改善のための提案はありますか?

編集: IIS/localhostでのコンパイル後の最初のヒットは(リリースモードとコンパイルdebug = falseの場合)約15秒です。リリース時に実行されているAzureのデプロイメントは、最初のヒットが速くなりますが、依然として5〜10秒の範囲です。私はDavid Ebboのプロジェクトを試みましたが、劇的なことは何も見ませんでした。

+0

は、通常のパフォーマンスのような音はありません。それらの時はひどいです。私ははるかに多くのコントローラとビュー、11のクラスライブラリ+最終的なMVCプロジェクトにまたがる非常に大きなMVCプロジェクトを持っています。私の見解(*いくつかの*多くの部分的なビューを持つもの)は、最初のヒットで(そしてデータベース呼び出しを含む)20ミリ秒以上かかることはめったにありません。 –

+1

これをチェックしてください:http://blog.davidebbo.com/2011/06/precompile-your-mvc-views-using.html – tugberk

+0

@tugberk、yup ..私もプリコンパイルされたビューを使用します。しかし、私はまだドナルドが経験している性能低下を期待していません。 –

答えて

2

このアプリケーションを頻繁に導入しますか?もしそうなら、私はなぜ最初のヒットパフォーマンスが懸念されるのかを知ることができます。

私たちは頻繁に展開し、展開を「ウォームアップ」するために別のプロジェクトを作成しました。これは、WebDriverを使用して、デプロイ後にコンパイルされていないビューをアプリで実行するユニットテストプロジェクトです。

基本的にWebDriver APIを使用してブラウザを起動し、コンパイルが必要な各URLにナビゲート()します。一度実行すると、展開は暖かいです。

また、Azureでは、アイドルタイムアウトをオフにすることができます。これにより、アイドル状態になることはありません。

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 

...などなどのAzureの展開時に、それを実行します:私たちは、このスクリプトを使用

<Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" taskType="simple" /> 
+0

私たちのアプリはまだ「アルファ」なので、我々はたくさんの展開をしています。それは、ビューに軽微な変更を加え、それが正しい調整であるかどうかを確認するために10秒間待つという長いサイクルから、より多くの不満です。 –

+0

私は間違いなくAzureのアイドルタイムアウトをオフにし、ウォーミングアッププロジェクトを実装する必要があります。 –

関連する問題