回答:
改善の可能性のある情報源をまとめたリストを以下に示します。
一般的な
キャッシング
CompiledQuery.Compile()
クエリ式の再コンパイルを回避して再帰的に使用するOutputCacheAttribute
不要なアクションの実行を節約するためにを使用して変更されにくいコンテンツをキャッシュするActionResult
必要に応じてカスタムメソッドを作成するRouteName
てルートを整理し、それを使用してリンクを生成することを検討し、式ツリーベースのActionLinkメソッドを使用しないようにします。PartialViews
、xxxx回レンダリングしないでください。同じビューで同じパーシャルを300回呼び出すことになる場合は、おそらく何か問題があります。説明とベンチマークルーティング
Url.RouteUrl("User", new { username = "joeuser" })
ルートを指定するために使用します。Rudi BenkovicによるASP.NET MVCパフォーマンス
このヘルパーを使用したキャッシュルートの解決UrlHelperCached
ASP.NET MVCパフォーマンス(Rudi Benkovic著)
安全保障
DAL
負荷分散
リバースプロキシを利用して、アプリのインスタンス全体にクライアントの負荷を分散します。(Stack OverflowはHAProxy(MSDN)を使用します)。
非同期コントローラーを使用して、外部リソースの処理に依存するアクションを実装します。
クライアント側
グローバル構成
Razorを使用する場合は、次のコードをglobal.asax.csに追加します。デフォルトでは、Asp.Net MVCはaspxエンジンとかみそりエンジンでレンダリングします。これはRazorViewEngineのみを使用します。
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
web.configにgzip(HTTP圧縮)と静的キャッシュ(画像、cssなど)を追加します。
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
基本的な提案はRESTの原則に従うことであり、次の点はこれらのプリンシパルのいくつかをASP.NET MVCフレームワークに結び付けます。
LINQを介してデータにアクセスする場合、IQueryableに依存します...
List()ではなくAsQueryable()を使用する理由
...そして適切なリポジトリパターンを活用する:
これにより、データアクセスが最適化され、必要なデータのみが読み込まれ、必要なときにだけ読み込まれるようになります。
驚異的な最適化ではありませんが、私はこれを捨てるつもりだと思いました-jQueryなどにCDNを使用します。ます。
ScottGu自身からの引用:Microsoft Ajax CDNを使用すると、ASP.NET AJAXまたはjQueryを使用するASP.NET WebフォームおよびASP.NET MVCアプリケーションのパフォーマンスを大幅に改善できます。このサービスは無料で利用でき、登録は必要なく、営利目的と非営利目的の両方で使用できます。
jQueryを使用するMossのWebパーツにもCDNを使用します。
また、NHibernateを使用する場合は、クエリの2次キャッシュをオンにして設定し、クエリのスコープとタイムアウトに追加できます。また、EF、L2S、NHibernate 用のキックアスプロファイラーがあります-http ://hibernatingrhinos.com/products/UberProf。クエリの調整に役立ちます。
私も追加します:
スプライトを使用する:スプライトは、リクエストを減らすのに最適です。すべての画像を1つにマージし、CSSを使用してスプライトの適切な部分にアクセスします。マイクロソフトは、これを行うための優れたライブラリを提供しています。 スプライトおよび画像最適化プレビュー4です。
サーバーオブジェクトのキャッシュ:まれにしか変更されない参照リストやデータがある場合、毎回データベースにクエリを実行する代わりに、それらをメモリにキャッシュできます。
代わりに、Entity Frameworkの使用ADO.NETは:EF4 or EF5
開発時間を短縮するために素晴らしいですが、最適化することが苦痛になります。Entity Frameworkよりもストアドプロシージャを最適化する方が簡単です。したがって、可能な限りストアプロシージャを使用する必要があります。Dapperは、非常に優れたパフォーマンスでSQLをクエリおよびマップする簡単な方法を提供します。
ページのキャッシュまたはページの一部:MVCは、いくつかのパラメーターに従ってページをキャッシュする簡単なフィルターを提供しているので、それを使用してください。
データベース呼び出しの削減:複数のオブジェクトを返す一意のデータベースリクエストを作成できます。DapperのWebサイトで確認してください。
常にクリーンなアーキテクチャを使用する:小規模なプロジェクトであっても、クリーンなn層アーキテクチャを使用します。コードをクリーンに保つのに役立ち、必要に応じて最適化するのが簡単になります。
このテンプレート「Neos-SDI MVCテンプレート」を見ると、デフォルトで多くのパフォーマンスが向上したクリーンなアーキテクチャが作成されます(MvcTemplate Webサイトを確認してください)。
サーバー側でのアプリケーションの最適化に関するすべての優れた情報に加えて、YSlowを確認する必要があります。クライアント側でサイトのパフォーマンスを向上させるための優れたリソースです。
これは、ASP.NET MVCだけでなく、すべてのサイトに適用されます。
1:タイミングを取得します。減速がどこにあるかがわかるまでは、質問は多すぎて答えることができません。私が取り組んでいるプロジェクトには、この正確な問題があります。特定の時間がどれだけかかるかを知るためのロギングはありません。プロジェクトにタイミングを追加するまで、アプリの遅い部分についてのみ推測できます。
2:順次操作がある場合は、軽くマルチスレッドすることを恐れないでください。特にブロッキング操作が含まれる場合。PLINQはあなたの友達です。
3:公開時にMVCビューを事前生成する...これは、「最初のページのヒット」の一部に役立ちます
4:スピードのストアドプロシージャ/ ADOの利点を主張する人もいます。他の人たちは、EFの開発のスピードと、ティアとその目的のより明確な分離を主張しています。SQLの設計が非常に遅く、データの取得と保存にSprocs / Viewsを使用するための回避策を見てきました。また、テストの難易度が上がります。ADOからEFに変換している現在のコードベースは、古いハンドロールモデルよりもパフォーマンスが悪い(場合によってはより良い)ことはありません。
5:そうは言っても、アプリケーションのウォームアップについて考えてみましょう。ほとんどのEFパフォーマンスの問題を解消するために私たちが行っていることの一部は、特別なウォームアップメソッドを追加することでした。クエリなどをプリコンパイルすることはありませんが、メタデータのロード/生成の多くに役立ちます。これは、Code Firstモデルを扱うときにさらに重要になる可能性があります。
6:他の人が言ったように、可能な場合はセッション状態またはViewStateを使用しないでください。これらは必ずしも開発者が考えるパフォーマンスの最適化ではありませんが、より複雑なWebアプリケーションの作成を開始すると、応答性が必要になります。セッション状態はこれを排除します。長時間実行されるクエリを想像してみてください。新しいウィンドウを開いて、それほど複雑ではないウィンドウを試すことにしました。サーバーは最初のリクエストが完了するまで待機してから、そのセッションの次のリクエストに移動するため、セッションステートをオンにして待機している可能性もあります。
7:データベースへの往復を最小限にします。頻繁に使用するものを現実的に.Netキャッシュに変更しないものを保存します。可能な場合は、挿入/更新をバッチ処理してください。
7.1:いまいましい正当な理由なしに、Razorビューでデータアクセスコードを回避する。見ていなかったら、これは言っていなかっただろう。彼らはモデルを組み立てるときにすでにデータにアクセスしていましたが、なぜそれをモデルに含めなかったのですか?
Microsoft Azure(IaaSまたはPaaS)でASP.NET MVCアプリケーションを実行している場合は、少なくとも最初の展開の前に以下を実行します。
上記のすべての回答を行いましたが、問題が解決しませんでした。
最後に、私は設定して、私の遅いサイトローディング問題を解決しPrecompileBeforePublishをしてプロフィールを公開する真。あなたが使用したい場合はMSBuildのを、あなたは、この引数を使用することができます。
/p:PrecompileBeforePublish=true
それは本当に大いに役立ちます。MVC ASP.NETのロードが10倍速くなりました。