2008-09-16 7 views
7

性能がほんのわずかな機能に大きく依存するプログラムがあり、単一のループまたはコードセグメントの速度を1クロック精度まで測定できるようにしたいので、変更が実際に改善しているかどうかを知ることができますパフォーマンスが向上しているのか、単に「最適化された」コードのプラセボに落ちているのかどうかはわかりませんお気に入りの低レベルプロファイリングツールは何ですか?

ffmpegの"bench.h"は、rdtscを使用してクロック時間を測定し、コンテキストスイッチなどを自動的に補うCマクロのセットです。もちろん、このアプローチには独自の弱点があります。他の低レベルのプロファイリングメソッドは、StackOverflowユーザーが好きですか?

答えて

2

今私は低レベルのプログラミングを行っていませんが、私がしたら、私は間違いなくdtraceを見ています。私が読んだことから、それは非常に興味深いようです。 OS Xユーザーの場合は、sharkもあります。

0

valgrindは、Unixベースのシステムでは私の選択ツールです。

0

主な問題は、ベンチマークをコンパイルしたときに、実装の方法とタイミングに応じて結果を変更する可能性があることです。これらの低レベルのものでは、おそらくコンパイラの最適化の影響を非常に受けます。

私はoprofile(oprofile)のソフトスポットを持っていますが、これはカーネルモジュールとして組み込まれたシステム全体のプロファイラであり、アプリケーションの所要時間を定期的にトレースします。これにより、システム全体が1つのアプリケーションだけでなくプロファイルされます。しかし、それはあなたに十分な細かさを与えていない可能性があります。

0

私はあなたのコードをプロファイリングすることを推奨しません。私が与えることができる最良の答えは、IntelのPTU(パフォーマンスチューニングユーティリティ)を使用することです。

このユーティリティは、VTuneの直系の子孫であり、利用可能な最高のサンプリングプロファイラを提供します。 CPUがどこに費やしているか、時間を無駄にしているか(利用可能なハードウェアイベントの助けを借りて)、アプリケーションの速度低下やプロファイルの摂動を追跡することができます。

1

valgrindのは既に述べたが、それはcallgrindツールで特に便利です:

$ valgrind --tool=callgrind your_program 

その後、データを視覚化するためにKCacheGrindを使用することができます。 Linuxの場合

0

Google Perftools

  • valgrindのより高速な(まだ、きめそう罰金ではない)
  • コード計測を必要としませんニースのグラフィカルな出力( - > kcachegrind)
  • んメモリプロファイリング、CPUプロファイリング、リークチェック
0

OK -spot状況 - 時間の大部分を占め、関数呼び出しを含まないタイトなループ。

あなたが行った変更が何らかの効果をもたらしているかどうかを知りたいとします。ここで

は、私がどうなるのかです:

  • を作るために変更するかを確認するには、それより早く、二つの方法、骨の単純な:内部ループを通して

1)シングルステップそれが何をしているのか、またその理由を正確に見ることができます。チャンスはかなり良いですが、私はより良くなるかもしれないいくつかのことを見るでしょう。

および/または

2)それは大きな外側のループで実行して、その後、手動でそれを中断取得します。これを数回行います。ほとんどの時間を占める命令/ステートメントは、コストに比例してサンプルに表示されます。私はどんな違いを作った場合は教えて

  • 、他の骨の簡単なテクニック:

はそれを外側のループで10億回を実行し、秒を数えます。これは、内部ループが何ナノ秒かかるかを示します。

関連する問題