タダでソフト開発の生産性と品質を上げる方法(10):プログラムの実行速度を瞬時に測定する「gprof」:山浦恒央の“くみこみ”な話(100)(3/3 ページ)
ついに連載第100回を迎えた「山浦恒央の“くみこみ”な話」。今回の「タダでソフト開発の生産性と品質を上げる方法」の第10回では、プログラムの実行速度を瞬時に測定する「gprof」を紹介します。
(b)使用方法
gprofを使う時は、次のようなコマンドを入力します。
- gcc -pg -o 実行ファイル名 ファイル名.c
- ./実行ファイル名
- gprof 実行ファイル名
上記のコマンドを入力すると、gprofはフラットプロファイル(図1)というログを表示します。実際には、コールグラフというログも表示しますが、説明を割愛します。
図1は、gprofの実行結果を一部抜粋したものです。ログの中央に、「% time」「cumulative seconds」「self seconds」「calls」「self ms/call」「total ms/call」「name」の表示があります。それぞれ計測項目の意味を表1に記します。
% time | 実行時間の割合 |
---|---|
cumulative seconds | 累積の実行時間 |
self seconds | 関数単体の実行時間 |
calls | 呼び出し回数 |
self ms/call | 1回のあたりの実行時間 |
total ms/call | 1回のあたりの実行時間(サブルーティンの実行時間も含む) |
name | 計測した関数の名前 |
図1と表1を見比べると、ログは次のように解釈できます。
- fncCの呼び出しに全体の実行時間の98.47%費やし、ボトルネックとなっている
- fncCの実行時間を関数単体で見ると41.73秒かかっている
- fncCの呼び出し回数は、1千万回である
- fncBの1回あたりの実行時間は、0.13s/1000=0.13msである
- fncBのサブルーティンを含む1回あたりの実行時間は、41.73+(0.13/1000)=41.86ms
上記のデータを事前に把握すると、不具合発生時の原因の切り分けに非常に効果的です。また、実行速度を早くする場合、fncCのようなボトルネックを見つけ、改善できます。
5.まとめ
今回の内容を以下にまとめます。
- gprofは、プログラムの実行速度を簡単に、瞬時に、測定するツールである
- gprofを実行すると、フラットプロファイルという実行速度を計測したログを表示する
- プログラムの実行速度をあらかじめ知ると、バグ発生時のトラブルシュートに使える
6.終わりに
今回は、プログラムの実行速度を計測するgprofを紹介しました。ハードウェアがどんなに進化しても、ソフトウェアの実行速度は重要です。あらかじめ実行速度を把握すると、問題発生時の原因の切り分けに役立ちます。
今回は説明できませんでしたが、フラットプロファイルのほかに、コールグラフと呼ぶログがあります。コールグラフでは、関数の呼び出し関係に着目した実行速度が計測できますので、より高度に分析できます。詳しくは、参考文献をご参照ください。
これまで10回に渡り、6つのツールを取り上げた「タダでソフト開発の生産性と品質を上げる方法」シリーズは、ここで終了し、次回から別のテーマを取り上げます。本シリーズで、筆者が伝えたかったことは、「できる限り楽に仕事しよう」です。面倒な作業、機械的な作業は、極力、人間が実行してはなりません。解決策の1つが、無料ツールを使うことです。本シリーズで紹介したツールは、必ず、役に立ちます。役に立つと実感した時は、シリーズの記事をさかのぼってみてください。
参考文献
[1]「UNIXプログラミング道具箱」(工藤智行、2004、技術評論社)
[2]「Cプログラム高速化研究班 コードを高速化する20の実験と達人の技」(片山善夫、2012、USP研究所)
山浦恒央氏が連載100回突破記念の講演を行います!
本連載を執筆している山浦恒央氏が、2017年12月6日開催の@ITとMONOistの共催セミナーに登壇します。講演タイトルは「組み込みソフトウェアで変わったこと、変わらないこと」。MONOist10周年記念で寄稿していただいた内容について、さらに掘り下げていただきます。山浦氏以外にも多くの講演がありますので、ぜひご参加ください(参加費無料)。
セミナー名:AI/IoT時代のソフトウェア開発〜ITとOTの出会う場所〜
開催日時:2017年12月6日(水)10:00〜18:05(受付開始9:30〜)
場所:ザ ストリングス 表参道(旧 青山ダイヤモンドホール)
申込Webサイト:https://itmedia.smartseminar.jp/public/application/add/1651
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- 組み込みソフトがこの10年で変わったこと、変わらないこと
MONOist開設10周年に合わせて、MONOistで記事を執筆していただいている方々からの特別寄稿を掲載していきます。第1弾は、間もなく連載100回を迎える「“くみこみ”な話」を執筆していただいている山浦恒央氏の寄稿です。 - タダでソフト開発の生産性と品質を上げる方法(9):メモリリークを一瞬で見つける「Valgrind」(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第9回。前回紹介した「Valgrind」を用いた具体的なメモリリークの検出方法について解説します。 - タダでソフト開発の生産性と品質を上げる方法(8):メモリリークを一瞬で見つける「Valgrind」(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第8回。今回は、ソフトウェアエンジニアを悩ませる常習的なバグ「メモリリーク」を簡単に検出できる「Valgrind」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(7):高機能な単体テストツール「GoogleTest」を使いこなす(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第7回。グーグル(Google)製の単体テストフレームワーク「GoogleTest」の高度な機能のうち、今回は「パスカバレッジ」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第6回。前回紹介したグーグル(Google)製の単体テストフレームワーク「GoogleTest」には高度な機能がありますが、今回は「アサーションマクロ」と「テストフィクスチャの使い方」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(5):グーグルの隠し球的単体テストツール「GoogleTest」
「タダでソフト開発の生産性と品質を上げる方法」の第5回。今回は、IT業界の巨人、グーグル(Google)製の単体テストフレームワーク「GoogleTest」を紹介する。