連載
» 2017年11月15日 10時00分 公開

タダでソフト開発の生産性と品質を上げる方法(10):プログラムの実行速度を瞬時に測定する「gprof」山浦恒央の“くみこみ”な話(100)(2/3 ページ)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

3.「gprof」とは

 参考文献[1]によると、ほんの数行のコードがプログラムの80%の実行時間を消費しているそうです。そのため、「ほんの数行」をあらかじめ把握し、問題発生時のトラブルシュートに活用しましょう。

 プログラムの実行速度を計測するツールは、いろいろありますが、C言語系で一般的なものが「gprof」です。gprofは、GCC(GNU Compiler Collection)にあるプログラムの実行速度を計測するツールです。このツールは、プログラムのコンパイル時に記録用のコードを埋め込み、プログラム実行の際に計測します。なお、環境構築は、GCCを導入していれば使用できます。筆者は、本コラムの第95回目で導入したCygwinを使います。構築手順は、そちらをご参照ください。

 本ツールの機能は幾つかありますが、「フラットプロファイル」という標準的な測定ログの見方を説明します。フラットプロファイルは「関数の実行時間」「呼び出し回数」などを表示するものです。

4.使い方

 gprofの使い方を説明します。今回はリスト1のプログラムで試してみましょう。

(a)例題プログラム

void fncA();
void fncB();
void fncC();
int main() {
	int i;
	for (i = 1; i <= 1000; i++){
		fncA();
		fncB();
	}
	return 0;	
}
void fncA() {
	int i;
	for (i = 1; i <= 10000; i++){}
}
void fncB() {
	int i;
	for (i = 1; i <= 10000; i++)
		fncC();
}
void fncC() {
	int i;
	for (i = 1; i <= 1000; i++){}
}

リスト1 例題プログラム

 リスト1は、今回使用する例題プログラムです。実行順序は、以下となります。

  • main関数で関数fncA、fncBを1回コールする
  • fncAでは、1万回無意味なループする
  • fncBは、1万回ループ内に、fncCをコールする
  • fncCは、1000回ループする

 無理やり無意味なループを入れたのは、PCの実行速度が早すぎて、意味のある計測結果が得られないためです。

Copyright © ITmedia, Inc. All Rights Reserved.