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

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

3.「gprof」とは

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

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

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

4.使い方

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

(a)例題プログラム

  1. void fncA();
  2. void fncB();
  3. void fncC();
  4. int main() {
  5. int i;
  6. for (i = 1; i <= 1000; i++){
  7. fncA();
  8. fncB();
  9. }
  10. return 0;
  11. }
  12. void fncA() {
  13. int i;
  14. for (i = 1; i <= 10000; i++){}
  15. }
  16. void fncB() {
  17. int i;
  18. for (i = 1; i <= 10000; i++)
  19. fncC();
  20. }
  21. void fncC() {
  22. int i;
  23. for (i = 1; i <= 1000; i++){}
  24. }

リスト1 例題プログラム

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

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

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

Copyright © ITmedia, Inc. All Rights Reserved.