.NET Tools

プログラムを仕上げるときの強力な助っ人DevPartner

(株)ピーデー 川俣 晶
2003/12/06
Page1 Page2 Page3 Page4

処理にかかった時間を計測する「パフォーマンス分析」

 プログラムの実行速度が遅く、改善しなければならない、という状況に直面することは珍しくない。こんなにCPUが速くなったのだから、無駄なコーディングでも問題ない……といわれることも多いのだが、それにもかかわらず、プログラムが遅いという状況はなくならない。理由は簡単で、下手なプログラミングによる実行速度の低下は、CPUの速度向上よりもはるかに大きいためだ。

 そのような場合には、ソース・コードを改良して、実行速度を上げねばならない。しかし、処理が重そうなソース・コードの個所を片っ端から書き換えていく方法は、正しいとはいえない。実行速度に対して、影響する個所と、そうではない個所があることが多く、影響のない個所を書き換えることには何の意味もなく、労力の無駄遣いといえる。それどころか、無用なソースの書き換えは、信頼性の低下を引き起こす潜在的な要因にもなりかねない。あくまで、ソース・コードのどの部分でどの程度の時間を消費しているかという実証的な数値を集め、それに沿ってソース・コードを修正すべきである。

 では、どうすれば実証的な数値を集められるのだろうか。それにはDevPartnerの「パフォーマンス分析」が使用できる。これは、プログラムのどの部分が、どの程度の時間を消費しているかを詳しくレポートしてくれるものである。

 今度は以下のようなプログラムを作成して試してみよう。VS.NETで、VB.NETのWindowsアプリケーションのテンプレートによりプロジェクトを作成する。そして、フォーム上にPictureBoxコントロールとButtonコントロールを1つずつ貼り付けて、以下のようなコードをButtonコントロールのClickイベントなどに書き込む。

  Private Function calcPosition(ByVal theta As Single) As Point
    Dim pt As Point
    pt.X = Math.Cos(theta * 13) * PictureBox1.Width / 2.1 + PictureBox1.Width / 2.0
    pt.Y = Math.Sin(theta * 17) * PictureBox1.Height / 2.1 + PictureBox1.Height / 2.0
    Return pt
  End Function

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim g As Graphics = Me.PictureBox1.CreateGraphics()
    Dim lastPosition As Point = calcPosition(0.0)
    Dim th As Single
    For th = 0 To Math.PI * 2.0 Step Math.PI / 3000
      Dim col As Color = Color.FromArgb(0, 0, th / (Math.PI * 2.0) * 63 + 192)
      Dim newPosition As Point = calcPosition(th)
      g.DrawLine(New Pen(col), lastPosition, newPosition)
      lastPosition = newPosition
    Next
  End Sub
「パフォーマンス分析」に使用するサンプル・コード
VB.NETでWindowsアプリケーションのプロジェクトを作成し、フォーム上にPictureBoxコントロールとButtonコントロールを1つずつ貼り付けてから、このコードを追加する。

 これを実行し、ボタンをクリックすると以下のように表示される。

上記サンプル・コードの実行画面

 このプログラムで、どの部分でどの程度の時間を使っているか調べるにはどうしたらよいだろうか。

 それを行うには、まず、VS.NETのメニューで、[ツール]−[DevPartner]−[パフォーマンス分析]と選び、パフォーマンス分析の項目を選択状態にする。そして、[デバッグ]メニューから、[デバッグなしで開始]を選ぶ。ここで[開始]を選んでは機能しない。必ず「デバッグなしで開始」を選ぶ。そして、プログラムを普通に実行させてから終了させる。すると、VS.NET内に以下のように結果が表示される。

パフォーマンス分析の実行結果
ここで表示されている[メソッドリスト]タブでは、.NET Frameworkクラス・ライブラリ内部で使用されたWin32 APIなどの処理時間の比率や呼び出し回数が表示される。

 ソース・コードにない名前がずらずらと並んでいると思うが、これらはWin32 APIレベルで実行されたAPI名などである。もっと直接的にソース・コードと連動して分かりやすいのが、[ソース]タブだろう。このタブに切り替えると以下のように表示される。

ソース・コード・レベルでのパフォーマンス分析
[ソース]タブでは、ソース・コードの行ごとに、呼び出された回数、下位を含んだ比率、実行時間が分かる。

 ここで、ソース・コードの行ごとに、回数、下位を含んだ比率、実行時間が分かる。これを見ると、7.94%という比率のDrawLineメソッドの呼び出しが目に付く。三角関数の計算が重い処理かと思いきや、Cos関数を呼び出している行は、わずか0.37%にすぎない。もし、このプログラムの実行速度を改善するとすれば、三角関数の計算を工夫してもあまり大きな効果は出ず、DrawLineメソッドの呼び出しを(呼び出し回数を減らすなどして)工夫する必要があることが分かる。

 さて、[セッションサマリ]のタブを選ぶと、以下のように要約を見ることができる。

パフォーマンス分析の要約を表示する[セッションサマリ]タブ

 そのほか、左部のツリーからは、コード上にあるメソッドの中で処理時間の長かった上位20位などの情報にアクセスすることもできる。

[ソース・メソッドの上位20位]の表示
左部のツリーからは、コード上にあるメソッドの中で処理時間の長かった上位20位などが表示できる。

 この例からは、ボタンのクリック・イベントのハンドラ(Button1_Clickメソッド)や、座標計算を行うcalcPositionメソッドなどの処理の割合が多いことが分かる。


 INDEX
  [.NET Tools]
  プログラムを仕上げるときの強力な助っ人DevPartner
     1.分析を支援するDevPartner
     2.ソース・コードの弱点を検出する「静的ソース・コード解析」
   3.処理にかかった時間を計測する「パフォーマンス分析」
     4.テスト漏れを防止する「カバレッジ分析」
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間