これは、Visual Studio 2010 Premiumの一部であるあまり知られていない機能であり、これを紹介するために時間を割いたいと思います。  ASP.NETアプリケーションが必要なパフォーマンスで動作しない理由、およびデータベースクエリがどのように構築されるかを、パフォーマンスが向上するか低下するかを判断するときに役立ちます。 
      
        
        
        
      
    
      
        
        
        
      
     この出版物で使用するために、 
Scott Guthrieとその友人によって書かれたシンプルで未知のNerdDinnerアプリケーションをダウンロードしました。  
ここからダウンロードしてインストールし、動作することを確認します(SQL Expressの作業バージョンがある場合、アプリケーションはプロジェクトに関連付けられたmdfファイルに添付ファイルを作成します。SQLExpressはVisual Studio 2010のすべてのインストールにデフォルトでインストールされますが、たとえば、SQL Expressの実行中に、ConnectionStrings.configファイルの接続文字列設定をいじる必要があります。接続文字列の構文についての知識は
ここで更新できます。 すべてが機能したら、ユーザーアカウントを登録して、以下で説明する手順を完了します。 
      
        
        
        
      
    
      
        
        
        
      
     さて、これで動作するWebアプリケーションができました。プロファイラーを実行して、表示されるものを見てみましょう。 
      
        
        
        
      
    
      
        
        
        
      
      パフォーマンスウィザードの起動 
      
        
        
        
      
    
      
        
        
        
      
      Visual Studioで、[分析]メニュー項目を選択し、[パフォーマンスウィザードを起動...]を選択します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     次に、次のダイアログが表示されます。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     デフォルト設定(「CPUサンプリング」)を選択し、「次へ」ボタンをクリックするだけです。 その後、次が表示されます。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     注:「NerdDinner」は、このダイアログで唯一の選択肢であり、現時点でプロファイルを作成する唯一のプロジェクトとして、これは良いことです。 実行可能ファイルまたはWebプロジェクトを生成するプロジェクトが多数ある場合は、それらも表示されます。 
      
        
        
        
      
    
      
        
        
        
      
      [次へ]をクリックすると、新しいウィザードページが表示されます。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      「Tier Interaction Profiling」をオンにしてください。これにより、この記事の後半で説明する機能が有効になります。 刊行物全体を読んで、何が危機にunderstandしているのかを理解するか、単に「次へ」をクリックします。 
      
        
        
        
      
    
      
        
        
        
      
      「ウィザードの終了後にプロファイリングを起動する」チェックボックスをオンのままにします。 
      
        
        
        
      
    
      
        
        
        
      
      Visual Studioは、NerdDinner WebアプリケーションでCassini Webサーバーを起動します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      アプリケーションの起動 
      
        
        
        
      
    
      
        
        
        
      
     この時点で、Visual Studioはパフォーマンスセッションを開始し、Visual Studioドキュメントに.vspファイルを適切にロードして、現在プロファイリングが進行中であることを示します。 
      
        
        
        
      
     この時点から、Visual Studioはパフォーマンスプロファイリングセッションを開始し、.vspファイルをドキュメント領域にアップロードして、プロファイリングが進行中であることを示します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     次の手順を実行します。 
      
        
        
        
      
    
      
        
        
        
      
    -  アプリケーションアカウントにログインします 
 -   2つの夕食を注文する 
      
        
        
        
      
     これを行うには、「ホストディナー」タブをクリックして、ページにディナー情報を入力し、「保存」をクリックしてから、これらの手順をもう一度繰り返します。  -   IEを閉じてアプリケーションを終了します 
 
      
        
        
        
      
    
      
        
        
        
      
     しばらくすると、Visual Studioは次の図のようなものを表示します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      結果分析 
      
        
        
        
      
    
      
        
        
        
      
      Visual Studioのプロファイリングツールキットの主な機能の1つは、ホットパスと呼ばれます。 パフォーマンスが低下する可能性のあるコード領域をすばやく表示します。 少なくとも、アプリケーションがほとんどの時間を費やしているものは完全に明確になります。 
      
        
        
        
      
    
      
        
        
        
      
     次の画像では、GetMostPopularDinnersメソッドが、完了したばかりのセッションに関してほとんどの時間がかかるように見えることがすぐにわかります。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     このリンク(メソッドを指す)をクリックしてみましょう。 以下のようなものが表示されるはずです。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     ここでは多くのことが起こっています。  [現在のビュー]ドロップダウンリストが[関数の詳細]に設定されていることに注意してください。 これは重要であり、Visual Studioユーザーの経験に関する問題、このドロップダウンリストがあることを知らず、機能のうらやましい共有を見逃すユーザーの数も強調しています。 これは、パフォーマンスセッションの異なるビューであるため、多くの人がTier Interaction Profilerを認識していない主な理由の1つです。 
      
        
        
        
      
    
      
        
        
        
      
      「大きな青い長方形」をクリックして遊ぶことができ、左または右の長方形をクリックして前後に移動します。 
      
        
        
        
      
    
      
        
        
        
      
     また、「ホットパス」機能を使用するときに注意を引くコード行を強調表示していることにも気づきました。 また、テキストエディタの左側の隅に42.2%の一時的な特性があり、実際の行はデフォルトで「赤みがかった」色でマークされています。 
      
        
        
        
      
    
      
        
        
        
      
     これは、クエリを呼び出す前に実際にLINQ式が構築される場所であるため、時間が無駄になっている行のようです(この概念に慣れていない場合は、 
この出版物を読むことを強くお勧めします)。 
      
        
        
        
      
    
      
        
        
        
      
     コードを見ると、このメソッドのバックエンドからデータベースにアクセスしているように見えます。 
      
        
        
        
      
    
      
        
        
        
      
     public ActionResult GetMostPopularDinners( int ? limit) 
      
        
        
        
      
     { 
      
        
        
        
      
     var dinners = dinnerRepository.FindUpcomingDinners(); 
      
        
        
        
      
     
      
        
        
        
      
     // Default the limit to 40, if not supplied. 
      
        
        
        
      
     if (!limit.HasValue) 
      
        
        
        
      
     limit = 40; 
      
        
        
        
      
     
      
        
        
        
      
     var mostPopularDinners = from dinner in dinners 
      
        
        
        
      
     orderby dinner.RSVPs.Count descending 
      
        
        
        
      
     select dinner; 
      
        
        
        
      
     
      
        
        
        
      
     var jsonDinners = 
      
        
        
        
      
     mostPopularDinners.Take(limit.Value).AsEnumerable() 
      
        
        
        
      
     .Select(item => JsonDinnerFromDinner(item)); 
      
        
        
        
      
     
      
        
        
        
      
     return Json(jsonDinners.ToList()); 
      
        
        
        
      
     } 
      
        
        
        
      
     
      
        
        
        
      
     * This source code was highlighted with Source Code Highlighter .
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
 
      
        
        
        
      
    
      
        
        
        
      
     データベースに送信されたTSQLを確認するにはどうすればよいですか?  Tier Interaction Profilerに進みましょう。 
      
        
        
        
      
    
      
        
        
        
      
      階層相互作用プロファイラー 
      
        
        
        
      
    
      
        
        
        
      
     上の画像で、現在調査中の行はSearchControllerの一部であることに注意してください。 コードを詳しく見てみましょう。GetMostPopularDinnersメソッドは実際にはコントローラーアクションであり、アプリケーションに関連するURLによって呼び出されます。 これはどういう意味ですか? 
      
        
        
        
      
    
      
        
        
        
      
     これはすべて、NerdDinnerアプリケーションが一連のテクノロジー、主にASP.NET MVC 2を示すモデルであることを示しています。ASP.NETMVC 2には非常に強力なURLルーティングメカニズムがあり、ユーザーフレンドリーなURL保守が容易など これは、Tier Interaction Profilingでデータを表示するときに明らかになります。 
      
        
        
        
      
    
      
        
        
        
      
      [現在のビュー]ドロップダウンリストをクリックして、[階層の相互作用]を選択します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     これで、トップパネルの画像に似たものが表示されます。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      「名前」列には、クライアント(この場合、NerdDinnerアプリケーションを実行しているIE)がサーバーから要求したさまざまなアーティファクトのリストが含まれています。 この要素のクエリの数が[カウント]列に記録されていること、およびクエリが実行されている時間を確認できます。 
      
        
        
        
      
    
      
        
        
        
      
     たとえば、「名前」列に
/Content/Production.cssが表示
されます。 このcssファイルは7回要求され、合計で38ミリ秒の遅延が発生しました。 したがって、サーバーへのアプリケーションが実行するさまざまな要求に関する情報を受信することは非常に便利です。 
      
        
        
        
      
    
      
        
        
        
      
     リストの一番上(および実行中の例に戻る)に、ほとんどの時間実行される
/ Search / GetMostPopularDinners要素があります。 通常、aspx(ページ)またはcss(ドキュメント)などで終わるアドレスが表示されますが、このアプリケーションはASP.NET MVC 2ルーティングを利用しているため、サーバーから要求されるよりわかりやすいアドレスが表示されます。 
      
        
        
        
      
    
      
        
        
        
      
     そして、データベースクエリで何をしますか? 
      
        
        
        
      
    
      
        
        
        
      
      TIP(Tire Interaction Profile)ビューは、サーバー要求をこれらの要求に関連付けられたデータベース呼び出しに関連付けます。 したがって、 
/ Search / GetMostPopularDinners要素を展開すると、次のように表示されます。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      / Search / GetMostPopularDinnersにあるサーバーへの逆クエリは、2つのデータベースクエリに変わります。 悪くはありませんが、さらに良いのは、[データベース接続の詳細]パネルでデータベースに送信されたTSQL自体を表示できることです。 エントリをダブルクリックして、次のような完全なSQLを表示します。 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
      結論 
      
        
        
        
      
    
      
        
        
        
      
      Tier Interaction Profilerを使用すると、クライアントからデータベースへのクエリを非常に簡単に理解できます。 どのSQLが渡されるかだけでなく、操作全体のパフォーマンスを分析することもできます。 
      
        
        
        
      
    
      
        
        
        
      
     これがお役に立てば幸いです! 
      
        
        
        
      
     キャメロン