質問
誰もが Rational Purify を使用していないことを願います。
では、測定したいときはどうすればよいでしょうか。
- 関数にかかった時間
- ピーク時のメモリ使用量
- コードカバレッジ
現時点では、タイムスタンプを含むログ ステートメントと、ログを解析して Excel に出力する別のスクリプトを使用して、これを手動で行っています。ふぅ…)
あなたは何をお勧めします?ツールやテクニックを指摘していただければ幸いです。
編集:申し訳ありませんが、最初に環境を指定しませんでした。 専用携帯電話のプレーン C プラットホーム
解決
おそらく、パフォーマンス プロファイリングとコード カバレッジには別のツールが必要になるでしょう。
プロファイリングに関しては、MacOSX 上の Shark を好みます。Appleから無料で提供されており、非常に優れています。あなたのアプリがバニラ C であれば、Mac を入手できれば使用できるはずです。
Windows でのプロファイリングには、LTProf を使用できます。安いですが、素晴らしいわけではありません:http://successsoftware.net/2007/12/18/optimising-your-application/
(Microsoft は、Visual Studio の安価なバージョンに適切なプロファイラーを提供しないことで、自らの足を痛めつけていると思います。)
カバレッジに関しては、Windows 上の Coverage Validator を好みます。http://successsoftware.net/2008/03/10/coverage-validator/カバレッジをリアルタイムで更新します。
他のヒント
私はこれをたくさんやりました。IDE または ICE をお持ちの場合は、 テクニックがあります 多少の手作業は必要ですが、必ず機能します。
警告:現代のプログラマはこれを嫌うので、私は反対票を投じられるでしょう。彼らは自分たちのツールが大好きです。しかし、それは実際に機能しますが、常に優れたツールを持っているわけではありません。
あなたの場合、コードはタイマーで実行されるDSPやビデオのようなものであり、高速である必要があると思います。各タイマーティックで実行するのがサブルーチン A であるとします。単純なループでサブルーチン A を実行するテスト コードを作成します (たとえば 1000 回、または少なくとも数秒待つのに十分な長さ)。
実行中に、一時停止キーを使用してランダムに停止し、(プログラム カウンターだけでなく) コール スタックをサンプリングして記録します。(これは手動の部分です。) これを何回か (10 回など) 繰り返します。一度では不十分です。
次に、スタック サンプル間の共通点を探します。少なくとも 2 つのサンプルに表示される命令または呼び出し命令を探します。これらは多数ありますが、そのうちのいくつかは最適化できるコード内にあります。
そうすれば、大幅なスピードアップが保証されます。1000 回の反復にかかる時間は短くなります。
たくさんのサンプルが必要ないのは、小さなものを探しているわけではないからです。たとえば、10 サンプル中 5 サンプルで特定の呼び出し命令が見つかった場合、それが合計実行時間の約 50% を占めています。本当に知りたい場合は、より多くのサンプルがあれば、パーセンテージが何であるかをより正確に知ることができます。あなたが私と同じなら、知りたいのはそれがどこにあるかだけなので、それを修正して次の場所に進むことができます。
これ以上最適化するものが見つからなくなるまでこれを実行すると、最高速度かそれに近い速度になります。
複雑なアプリケーションに関しては、私は Intel の大ファンです。 ヴチューン. 。コードを計測する従来のプロファイラーとは考え方が少し異なります。これは、プロセッサをサンプリングして命令ポインタがどこにあるかを 1 秒あたり 1,000 回確認することで機能します。これには、バイナリを変更する必要がないという大きな利点がありますが、変更によって測定対象のタイミングが変更されることはほとんどありません。
残念ながら、Vtune には従来のコードのように命令ポインタをシンボルにマップする方法がないため、.net や Java には役に立ちません。
また、命令ごとのクロック、キャッシュのヒット/ミス、TLB のヒット/ミスなど、他のあらゆる種類のプロセッサ/ハードウェア中心のメトリクスを測定することもでき、コードの特定のセクションの実行に通常よりも時間がかかる理由を特定できます。コードを検査するだけで期待できます。
「オン・ザ・メタル」の組み込み「C」システムを実行している場合 (投稿で「モバイル」が何を暗示しているのかよくわかりませんが)、通常はある種のタイマー ISR があり、サンプリングはかなり簡単です。割り込みが発生したコード アドレス (スタックを掘り返すか、リンク レジスタなどを調べることによって)。そうすれば、粒度/対象範囲の組み合わせでアドレスのヒストグラムを作成するのは簡単です。
通常、ヒストグラムのカウントをリンカー シンボル/リスト ファイルのアドレスと結合してプロファイル情報を提供する、コード/スクリプト/Excel シートの組み合わせを作成するのはそれほど難しくありません。
RAM が非常に限られている場合、これを簡単かつ便利にするために十分なデータを収集するのは少し面倒かもしれませんが、プラットフォームについて詳しく教えていただく必要があります。
nProf - 無料、.NET 用です。
少なくとも 80/20 点を確認できる程度には仕事をやり遂げます。(コードの 20%、時間の 80% がかかります)
の Google Perftools はこの点で非常に役立ちます。
私が使う 開発パートナー MSVC 6 および XP を使用した場合
プラットフォームが独自の OS である場合、ツールはどのように機能しますか?あなたは今できる最善を尽くしていると思います