忍者ブログ
プログラミングとか日常とかの覚書っぽいなにか
[24] [23] [22] [21] [20] [19] [18] [17] [16] [15] [14]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ソフト開発の技術書には、パフォーマンス最適化について書かれているものも多いですが、そこで必ずと言っていいくらいに述べられているのが、「コードを書く時点から最適化をしない」「手を加える前にまずパフォーマンスを測定せよ」ということです。

「プログラムの処理にかかる時間の80%はコード全体の20%の部分が占める」という、いわゆるパレートの法則に則り、まず測定によってプログラムの実行時間の大半を占めるわずかな部分のコードを割り出して、そこを集中的に改善しましょう、というのが定説です。

コードの測定には通常、プロファイラと呼ばれるツールを使います。
プロファイラは、どの関数がどのくらいの時間実行されていたか、何回呼び出されたかなどの方法を収集して解析し、ボトルネックとなっている部分を探すことができるものです。

VC6.0時代にはプロファイラが標準機能として存在したのですが、なぜかVC.NET 2002以降、標準ではプロファイラがなくなってしまったようです。
VCで使えるフリーのプロファイラというと、以前にCompuwareという会社が「DevPartner Profiler Community Edition」という無償のプロファイラを公開していて、VC.NET 2003やVC2005などで使えたのを記憶しているのですが、最近はどうやらダウンロードできなくなっているようですね。(まぁ、これは無償のVC2005 Express Editionでは使えなかったんですけどね。)

そこで、VCで(できれば無償で利用できるExpress Editionで)利用可能なフリーのプロファイラがないかどうかというのを探してみました。
そしたらあるじゃないですか、しかも本家本元のマイクロソフトがちゃんと用意してくれてました。
というか、こんな形で公開するなら最初から一緒にしておいてくれればいいのに。

ということで、マイクロソフトが公開しているプロファイラを使ってプロファイルを行う方法を簡単に紹介しておきます。ここでは、ビルド環境としてVisual C++ 2008 Express Edition (SP1) を使っています。

2011/07/05  Visual C++ 2010 の場合の方法を追記しました。


インストール方法

まず、マイクロソフトの以下のWebサイトから「vs_profiler_x86.exe」(32bit版の場合)をダウンロードしてインストールします。

Microsoft Download Center
Visual Studio 2008 Service Pack 1 スタンドアロンのプロファイラ
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=fd02c7d6-5306-41f2-a1be-b7dcb74c9c0b

上記のツールはVC2008 (SP1) 用のものです。ビルド環境がVC2010 (SP1) の場合は、代わりに以下からダウンロードしてください。

Microsoft Download Center
Visual Studio 2010 Performance Tools Service Pack 1
http://www.microsoft.com/downloads/details.aspx?displayLang=ja&FamilyID=c6db79bf-b076-413b-90c7-ea6457025ebd

なお、こちらで試した限りでは、VC2008でビルドした実行可能ファイルを、VS2010用の「Visual Studio 2010 Performance Tools Service Pack 1」を使ってプロファイル可能でした。VC2008でビルドをしている場合はどちらでも使用可能ですが、それぞれ実行環境要件が異なるので、自分の実行環境に合った方を選択するとよいと思います。


ダウンロード後のインストール方法は以下のページを参照。

方法:スタンドアロンのプロファイラをインストールする
http://msdn.microsoft.com/ja-jp/library/bb385771%28v=VS.90%29.aspx


インストールフォルダにパスが通るように環境変数 PATH を設定します。
環境変数 _NT_SYMBOL_PATH にもシンボルサーバ情報をセットします。
基本的に、プロファイラの操作はすべてコマンドラインで行いますので、以下のようにバッチファイルを作ってしまうのがいいかと思います。

set PATH=C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Performance Tools;%PATH%
set _NT_SYMBOL_PATH=symsrv*symsrv.dll*C:\localsymbols*http://msdl.microsoft.com/download/symbols
start %ComSpec%


※VC2010 (SP1) の場合やOSが64bit版Windowsである場合はデフォルトのインストールフォルダが変わりますので、適宜書き換えてください。

※Windows Vista や Windows 7 の場合、上記で作成したバッチファイルから普通に起動したコマンドプロンプトではツールが正常に動かない場合があります。この場合はコマンドプロンプトを管理者権限で実行する必要があります。バッチファイルを右クリックして「管理者として実行」を選択して起動してください。


対象プログラムのリンカオプション

プロファイラで使用するアプリケーションは、リンクオプションにより以下のオプションを指定しておく必要があります。
  • 「/DEBUG」リンカオプション(コンパイルオプションで /Zi を指定している場合は自動的に指定されます)
  • 「/PROFILE」リンカオプション

IDEで指定する場合は、プロジェクトのオプションでそれぞれ以下の通りに指定します。
  • 「構成プロパティ」→「リンカ」→「デバッグ」→「デバッグ情報の生成」を「はい」
  • 「構成プロパティ」→「リンカ」→「詳細」→「プロファイル」を「はい」

MSDNでは「/PROFILE は Enterprise (チーム開発) バージョンでのみ利用できます」と書かれていますが、実際にはExpress Editionでも指定可能となっています。


サンプリングモードによる測定

サンプリング方式は、ある一定時間ごと(一定クロック数ごと)に実行データを収集する測定方法です。

1. マネージアプリへのサンプリング有効化 (マネージ(.NET)アプリが対象の場合のみ)
VSPerfCLREnv /sampleon
 
2. サンプリングモードでデータ収集ログ開始
VSPerfCmd /start:sample /output:出力VSPファイル名
 
3. 計測対象アプリケーション起動してプロファイラをアタッチ
VSPerfCmd /launch:実行ファイル名 /args:起動パラメータ
 
※すでに起動しているプロセスの場合は
VSPerfCmd /attach:プロセスID
または
VSPerfCmd /attach:起動中の実行ファイル名
 
4. 計測対象アプリケーション終了

5. VSPerfMon の終了
VSPerfCmd /shutdown

6. マネージアプリへのサンプリング無効化 (マネージ(.NET)アプリが対象の場合のみ)
  VSPerfCLREnv /sampleoff

トレースモード(インストルメンテーション方式)による測定

トレース方式(インストルメンテーション方式)では、コードに含まれるすべての(もしくは選択した)関数の先頭と末尾でデータを収集します。

すべての情報を記録する分、サンプリング方式よりも正確で確実ではありますが、非常に時間がかかります。
通常の測定なしの実行よりも数倍から数十倍もの時間がかかる場合もあります。

1. マネージアプリへのトレース有効化 (マネージ(.NET)アプリが対象の場合のみ)
VSPerfCLREnv /traceon

2. 試験対象実行ファイルのインストルメント (トレース用コード埋込み)
VSInstr 実行ファイル名

 ※ 元のファイルのバックアップが拡張子 .orig で作成される

 ※ 小さい関数を除外するオプションが有効かも
VSInstr 実行ファイル名 /ExcludeSmallFuncs

3. トレースモードでデータ収集ログ開始
VSPerfCmd /start:trace /output:出力VSPファイル名

4. コマンドラインから計測対象アプリケーション起動・終了

5. VSPerfMon の終了
VSPerfCmd /shutdown

6. マネージアプリへのトレース無効化 (マネージ(.NET)アプリが対象の場合のみ)
VSPerfCLREnv /traceoff

結果レポート出力

計測結果はVSPerfReportコマンドによりCSV形式で出力することができます。
VSPerfReport VSPファイル名 /summary:all

 ※ /summary:all ですべての種類のレポートを出力するが、特定レポートを出力するように指定することも可能。

以下のレポートが出力されます。以下のもの以外にも数種類出力されます。
プログラムの大きさや実行時間によっては数十万行に及ぶファイルもあるので注意が必要です。
(CallerCallee や CallTree などが特に大きいです)。
  • <ReportName>_CallerCalleeSummary.csv
    呼び出し/被呼び出し関係。それぞれの関数(Root)と、その関数を呼び出している関数(Caller)およびその関数から呼び出されている関数(Callee)の一覧が記載されています。
  • <ReportName>_CallTreeSummary.csv
    呼び出しツリー。特定の呼び出しトレースをたどり、どのトレースが最もパフォーマンスに影響を及ぼしているかを解析することができます。
  • <ReportName>_Header.csv
    ヘッダ情報。プロファイリング環境に関する一般情報を含みます。
  • <ReportName>_FunctionSummary.csv
    関数一覧。プロファイリング中に呼び出されたすべての関数の一覧を含みます。

参考リンク

VSInstr コマンド説明
http://msdn.microsoft.com/ja-jp/library/ms182402%28v=VS.90%29.aspx

VSPerfCmd コマンド説明
http://msdn.microsoft.com/ja-jp/library/ms182403%28v=VS90%29.aspx

VSPerfReport コマンド説明
http://msdn.microsoft.com/ja-jp/library/ms182405%28v=VS.90%29.aspx

patterns & practices: Performance Testing Guidance
http://perftesting.codeplex.com/wikipage?title=How%20To%3A%20Identify%20a%20Disk%20Performance%20Bottleneck%20Using%20SPA

拍手

PR

コメント
無題
読ませていただきました。
大変参考になりました。
これからも、良い情報の発信をしていだければと思います。
ありがとうございました。

仕様書作成係
http://www.hotdocument.net/
【2010/07/09 14:54】 NAME[仕様書作成係] WEBLINK[URL] EDIT[]


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


忍者ブログ [PR]
プロフィール
HN:
はむぱい
職業:
ソフト作ったりしてる人
Twitter
最新CM
[06/09 replica rolex oyster perpetual datejust]
[06/09 bracelets imitation cartier love]
[06/09 replica the oyster perpetual datejust]
[06/09 datejust rolex oyster perpetual]
[06/09 replica gold love bangle]
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
ブログ内検索
あ~いい漢字