62

C で小さなプログラムを書いていますが、そのパフォーマンスを測定したいと考えています。

プロセッサでの実行時間と、キャッシュ ヒット + ミスの回数を確認したいと考えています。コンテキスト スイッチとメモリ使用量に関する情報もあると便利です。

プログラムの実行には 1 秒もかかりません。

/proc/[pid]/stat の情報は気に入っていますが、プログラムが終了した/終了した後にそれを確認する方法がわかりません。

何か案は?

編集: Valgrind は多くのオーバーヘッドを追加すると思います。そのため、/proc/[pid]/stat のような、常にそこにあるシンプルなツールが必要でした。

4

4 に答える 4

100

使用パフォーマンス:

perf stat ./yourapp

詳細については、カーネル wiki の perf チュートリアルを参照してください。これは、CPU のハードウェア パフォーマンス カウンターを使用するため、オーバーヘッドは非常に小さくなります。

ウィキからの例:

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

        5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
      235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
    9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
  240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
          217 page-faults              #      0.000 M/sec
            3 CPU-migrations           #      0.000 M/sec
           83 context-switches         #      0.000 M/sec
   956.474238 task-clock-msecs         #      0.999 CPUs

   0.957617512  seconds time elapsed

カーネル モジュールを手動でロードする必要はありません。最新の debian システム (linux-base パッケージを使用) では動作するはずです。perf record -a/コンボを使用すると、perf reportシステム全体のプロファイリングを行うこともできます。デバッグ シンボルを持つアプリケーションまたはライブラリは、レポートに詳細が表示されます。

視覚化には、フレーム グラフがうまく機能しているようです。(2020 年更新:ホットスポットUI にはフレーム グラフが統合されています。)

于 2012-04-11T21:33:32.490 に答える
10

あなたに最適なツールはvalgrindです。メモリのプロファイリング、コールグラフの構築などを行うことができます。

sudo apt get install valgrind
valgrind ./yourapp

ただし、プログラムの実行時間を取得するには、time(8)Linux ユーティリティを使用できます。

time ./yourapp
于 2012-04-10T02:51:19.313 に答える
9

使用することもできます

/usr/bin/time -v YourProgram.exe

次のすべての情報が表示されます。

/usr/bin/time -v ls
    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 60%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 4080
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 314
    Voluntary context switches: 1
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

-f フラグを使用して、必要に応じて出力をフォーマットすることもできます。

必ずフルパスを使用してこのプログラムを呼び出してください。そうしないと、「time」コマンドが呼び出され、それは必要なものではありません...

お役に立てれば!

于 2013-02-22T13:36:34.727 に答える