ASP.NET MVCアプリケーションのパフォーマンスを向上させるにはどうすればよいですか?


回答:


311

改善の可能性のある情報源をまとめたリストを以下に示します。

一般的な

  • プロファイラーを使用して、アプリケーションのメモリリークとパフォーマンスの問題を発見します。個人的に私はdotTraceをお勧めします
  • 本番稼働中、およびパフォーマンスプロファイリング中に、デバッグモードではなくリリースモードでサイトを実行します。リリースモードははるかに高速です。デバッグモードでは、独自のコードでパフォーマンスの問題を隠すことができます。

キャッシング

  • CompiledQuery.Compile() クエリ式の再コンパイルを回避して再帰的に使用する
  • OutputCacheAttribute 不要なアクションの実行を節約するためにを使用して変更されにくいコンテンツをキャッシュする
  • 頻繁にアクセスされる機密性の低い情報にCookieを使用する
  • ETagと有効期限を利用する- ActionResult必要に応じてカスタムメソッドを作成する
  • を使用しRouteNameてルートを整理し、それを使用してリンクを生成することを検討し、式ツリーベースのActionLinkメソッドを使用しないようにします。
  • ルート解決キャッシュ戦略の実装を検討する
  • 反復的なコードを内に入れてPartialViewsxxxx回レンダリングしないでください。同じビューで同じパーシャルを300回呼び出すことになる場合は、おそらく何か問題があります。説明とベンチマーク

ルーティング

安全保障

  • フォーム認証を使用し、頻繁にアクセスされる機密データを認証チケットに保存します

DAL

負荷分散

  • リバースプロキシを利用して、アプリのインスタンス全体にクライアントの負荷を分散します。(Stack OverflowはHAProxyMSDN)を使用します)。

  • 非同期コントローラーを使用して、外部リソースの処理に依存するアクションを実装します。

クライアント側

  • クライアント側を最適化し、YSlowなどのツールを使用してパフォーマンスを改善するための提案を行う
  • AJAXを使用してUIのコンポーネントを更新し、可能な場合はページ全体の更新を避けます。
  • タイムアウトに基づくリロードに対するコンテンツ配信のために、pub-subアーキテクチャ(つまり、Comet)の実装を検討してください。
  • 可能であれば、チャートおよびグラフ生成ロジックをクライアント側に移動します。グラフの生成は高価な作業です。不要な負担からサーバーをクライアント側に据え置き、新しいリクエスト(つまり、Flexチャート、jqbargraphMoreJqueryCharts)を行わずにローカルでグラフを操作できるようにします。
  • スクリプトとメディアコンテンツにCDNを使用して、クライアント側のロードを改善します(Google CDNなど
  • Minify- コンパイル -スクリプトサイズを改善するためのJavaScript
  • Cookieはリクエストごとにサーバーに送信されるため、Cookieのサイズを小さくしてください。
  • 可能であれば、DNSとリンクのプリフェッチの使用を検討してください。

グローバル構成

  • 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>

  • 未使用のHTTPモジュールを削除する
  • HTMLが生成されたらすぐに(web.configで)フラッシュし、使用していない場合はビューステートを無効にします。 <pages buffer="true" enableViewState="false">

6
たとえば、IListを刺激して結果セットを表示するビューがあり、各リストアイテムに対してRender.PartialView( "Row"、item)を呼び出すと、パフォーマンスが低下しますか?どれだけ失うの?またはどのようにしてパフォーマンスの向上を測定できますか?
marc.d 2010

@SDReyes- pub-subアーキテクチャの意味は何ですか?
Mohammed Zameer 2015年

1
これはカッコいい。Uber Profilerのリンクは機能していません。これをORM固有のプロファイラーの1つにリンクする必要がありますか?
shanabus 16

12

基本的な提案はRESTの原則に従うことであり、次の点はこれらのプリンシパルのいくつかをASP.NET MVCフレームワークに結び付けます。

  1. コントローラーをステートレスにします-これは(マイクロ/マシンレベルのパフォーマンスとは対照的に)「Webパフォーマンス/スケーラビリティ」の提案であり、アプリケーションの将来に影響を与える主要な設計上の決定です-特に人気が出た場合、またはいくつか必要な場合たとえば耐障害性。
    • セッションを使用しない
    • tempdataを使用しない-セッションを使用します
    • すべてを「時期尚早」に「キャッシュ」しようとしないでください。
  2. フォーム認証を使用する
    • 頻繁にアクセスする機密データを認証チケットに保管します
  3. 頻繁にアクセスされる機密性の低い情報にCookieを使用する
  4. あなたの作るリソースがキャッシュ可能な Web上
  5. JavaScriptをコンパイルします。それを行うためのClosureコンパイラーライブラリもあります(他にもあります。「JavaScriptコンパイラー」検索してください)。
  6. CDN(コンテンツ配信ネットワーク)を使用してください-特に大きなメディアファイルなどには。
  7. SQL Serverだけでなく、ファイル、キー/値ストアなど、データのさまざまなタイプのストレージを検討してください
  8. 最後になりましたが、ウェブサイトのパフォーマンスをテストします

10

コードクライマーこのブログエントリは、アプリケーションのパフォーマンスを向上させる詳細な方法を提供します。

コンパイルされたクエリはアプリケーションのパフォーマンスを向上させますが、ASP.NET MVCとの共通点はありません。すべてのdbアプリケーションを高速化するため、実際にはMVCについてではありません。


7

これは当たり前のように思えるかもしれませんが、本番稼働中やパフォーマンスプロファイリング中にも、デバッグモードではなくリリースモードでサイトを実行します。リリースモードははるかに高速です。デバッグモードでは、独自のコードでパフォーマンスの問題を隠すことができます。



6

驚異的な最適化ではありませんが、私はこれを捨てるつもりだと思いました-jQueryなどにCDNを使用します。ます。

ScottGu自身からの引用:Microsoft Ajax CDNを使用すると、ASP.NET AJAXまたはjQueryを使用するASP.NET WebフォームおよびASP.NET MVCアプリケーションのパフォーマンスを大幅に改善できます。このサービスは無料で利用でき、登録は必要なく、営利目的と非営利目的の両方で使用できます。

jQueryを使用するMossのWebパーツにもCDNを使用します。


6

また、NHibernateを使用する場合は、クエリの2次キャッシュをオンにして設定し、クエリのスコープとタイムアウトに追加できます。また、EF、L2S、NHibernate 用のキックアスプロファイラーがあります-http ://hibernatingrhinos.com/products/UberProf。クエリの調整に役立ちます。


Ayendeは最近、EFプロファイラーがサンプルMVCアプリの調整にどのように役立つかについてブログに投稿しました:ayende.com/Blog/archive/2010/05/17/…–
Frank

5

私も追加します:

  1. スプライトを使用する:スプライトは、リクエストを減らすのに最適です。すべての画像を1つにマージし、CSSを使用してスプライトの適切な部分にアクセスします。マイクロソフトは、これを行うための優れたライブラリを提供しています。 スプライトおよび画像最適化プレビュー4です。

  2. サーバーオブジェクトのキャッシュ:まれにしか変更されない参照リストやデータがある場合、毎回データベースにクエリを実行する代わりに、それらをメモリにキャッシュできます。

  3. 代わりに、Entity Frameworkの使用ADO.NETはEF4 or EF5開発時間を短縮するために素晴らしいですが、最適化することが苦痛になります。Entity Frameworkよりもストアドプロシージャを最適化する方が簡単です。したがって、可能な限りストアプロシージャを使用する必要があります。Dapperは、非常に優れたパフォーマンスでSQLをクエリおよびマップする簡単な方法を提供します。

  4. ページのキャッシュまたはページの一部:MVCは、いくつかのパラメーターに従ってページをキャッシュする簡単なフィルターを提供しているので、それを使用してください。

  5. データベース呼び出しの削減:複数のオブジェクトを返す一意のデータベースリクエストを作成できます。DapperのWebサイトで確認してください。

  6. 常にクリーンなアーキテクチャを使用する:小規模なプロジェクトであっても、クリーンなn層アーキテクチャを使用します。コードをクリーンに保つのに役立ち、必要に応じて最適化するのが簡単になります。

  7. このテンプレート「Neos-SDI MVCテンプレート」を見ると、デフォルトで多くのパフォーマンスが向上したクリーンなアーキテクチャが作成されます(MvcTemplate Webサイトを確認してください)。


より多くの結果セットを返す1つのストアドプロシージャを実行してから、非同期モードでより多くのストアドプロシージャを実行する方が良いと思いますか?
Muflix 2016

4

サーバー側でのアプリケーションの最適化に関するすべての優れた情報に加えて、YSlowを確認する必要があります。クライアント側でサイトのパフォーマンスを向上させるための優れたリソースです。

これは、ASP.NET MVCだけでなく、すべてのサイトに適用されます。


3

非常に簡単なことの1つは、ページに必要なデータにアクセスするときに非同期的に考えることです。Webサービス、ファイル、データベースなどから読み取る場合でも、できるだけ非同期モデルを使用してください。必ずしも1つのページが高速になるとは限りませんが、サーバー全体のパフォーマンスが向上します。


2

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ビューでデータアクセスコードを回避する。見ていなかったら、これは言っていなかっただろう。彼らはモデルを組み立てるときにすでにデータにアクセスしていましたが、なぜそれをモデルに含めなかったのですか?


2
  1. Gzipを実装します。
  2. 部分ビューには非同期レンダリングを使用します。
  3. データベースのヒットを最小限に抑えます。
  4. コンパイルされたクエリを使用します。
  5. プロファイラーを実行し、不要なヒットを見つけます。応答を返すのに1秒以上かかるすべてのストアドプロシージャを最適化します。
  6. キャッシングを使用します。
  7. バンドルの縮小最適化を使用します。
  8. 読み取り専用コンテンツには、セッションキャッシュやローカルストレージなどのHTML 5ユーティリティを使用します。

2

ちょうど私の2セントを追加したかった。MVCアプリケーションでのURLルートの生成を最適化する最も効果的な方法は、それらをまったく生成しないことです。

とにかく、ほとんどの人はアプリでURLがどのように生成されるかを知っているので、単に静的のUrl.Content("~/Blahblah")代わりに、Url.Action()またはUrl.RouteUrl()可能な場合は、他のすべてのメソッドを20倍以上も上回っています。

PS。数千回の反復のベンチマークを実行し、興味があればブログに結果を投稿しました。


1

クライアント側を最適化するための熱狂の中で、データベースレイヤーについて忘れないでください。5秒から50秒まで一晩でロードするアプリケーションがありました。

インスペクションでは、スキーマの変更をたくさん行いました。統計を更新すると、突然、以前と同じように応答が速くなりました。


0

以下はやることです

  1. カーネルモードキャッシュ
  2. パイプラインモード
  3. 未使用のモジュールを削除する
  4. runAllManagedModulesForAllRequests
  5. wwwrootで書かないでください
  6. 未使用のビューエンジンと言語を削除する

0

バンドリングとミニフィケーションを使用すると、パフォーマンスの向上にも役立ちます。基本的に、ページの読み込み時間を短縮します。


0

Microsoft Azure(IaaSまたはPaaS)でASP.NET MVCアプリケーションを実行している場合は、少なくとも最初の展開の前に以下を実行します。

  • 静的コードアナライザーを使用してコードをスキャンし、あらゆる種類のコードの負債、重複、複雑さ、およびセキュリティを確認します。
  • 常にApplication Insightを有効にし、パフォーマンス、ブラウザー、および分析を頻繁に監視して、アプリケーションのリアルタイムの問題を見つけます。
  • 画像、アセット、一般的なレイアウトなどの静的で頻度の低い変更データにAzure Redis Cacheを実装する
  • Azureが提供するAPM(アプリケーションパフォーマンス管理)ツールに常に依存します。
  • アプリケーションの内部部分間の通信パフォーマンスを調査するには、アプリケーションマップを頻繁に参照してください。
  • データベース/ VMのパフォーマンスも監視します。
  • 必要かつ予算内である場合は、ロードバランサー(水平スケール)を使用します。
  • アプリケーションのターゲットユーザーが世界中にいる場合は、Azure Trafic Managerを使用して受信リクエストを自動的に処理し、最も利用可能なアプリケーションインスタンスに転送します。
  • 低パフォーマンスに基づいてアラートを作成することにより、パフォーマンス監視を自動化してみてください。

0

.Netバージョンに従って、最新バージョンのTask Parallel Library(TPL)を使用します。さまざまな目的でTPLの正しいモジュールを選択する必要があります。


0

上記のすべての回答を行いましたが、問題が解決しませんでした。

最後に、私は設定して、私の遅いサイトローディング問題を解決しPrecompileBeforePublishをしてプロフィールを公開する。あなたが使用したい場合はMSBuildのを、あなたは、この引数を使用することができます。

 /p:PrecompileBeforePublish=true

それは本当に大いに役立ちます。MVC ASP.NETのロードが10倍速くなりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.