1

パフォーマンスを比較したいプログラムのバリエーションがいくつかあります。どちらも基本的に同じタスクを実行します。

Cとメモリですべてを行います。もう 1 つは外部ユーティリティを呼び出し、ファイル IO を実行します。

それらを確実に比較するにはどうすればよいですか?

1) 「time」を使用して「CPU の時間」を取得すると、system() を呼び出して IO を実行するための 2 番目のバリアントが優先されます。「システム」時間を「ユーザー」時間に追加しても、wait() でブロックされた時間はカウントされません。

2)サーバー上で実行され、いつでもCPUからプッシュできるため、それらをクロックすることはできません。サーバーがどのように利用されているのかわからないため、数千回の実験の平均化はソフトオプションです。これはクラスター上の VM であり、複雑です。

3) プロファイラーは、コードに費やす時間を与えてくれるので役に立ちません。この場合も、system() を実行するバージョンが好まれます。

これらのプログラムが消費するすべての CPU 時間を合計する必要があります。これには、ユーザー、カーネル、IO、および子が再帰的に含まれます。

これはよくある問題だと思っていましたが、まだ解決策が見つからないようです。

(times() で解決 - 以下を参照してください。皆さん、ありがとうございます)

4

5 に答える 5

2

私が理解しているのであれば、bashコマンドラインで「timemyapplication」と入力することはあなたが探しているものではありません。

正確さが必要な場合は、プロファイラーを使用する必要があります...ソースがありますね。

OprofileValgrindのようなものを試すか、これを見て、より拡張されたリストを確認してください。

ソースがない場合は、正直なところわかりません...

于 2008-09-29T17:57:46.683 に答える
2

/usr/bin/time (bash に組み込まれている「時間」ではありません) は、興味深い統計情報を提供します。

$ /usr/bin/time -v xeyes
    タイミングをとるコマンド: "xeyes"
    ユーザー時間 (秒): 0.00
    システム時間 (秒): 0.01
    このジョブが取得した CPU の割合: 0%
    経過 (壁掛け時計) 時間 (h:mm:ss または m:ss): 0:04.57
    平均共有テキスト サイズ (キロバイト): 0
    非共有データの平均サイズ (キロバイト): 0
    平均スタック サイズ (キロバイト): 0
    平均合計サイズ (キロバイト): 0
    常駐セットの最大サイズ (KB): 0
    常駐セットの平均サイズ (KB): 0
    主要な (I/O が必要な) ページ フォールト: 9
    マイナー (フレームの再利用) ページ フォールト: 517
    自発的なコンテキストスイッチ: 243
    非自発的なコンテキスト スイッチ: 0
    スワップ: 0
    ファイルシステム入力: 1072
    ファイル システム出力: 0
    送信されたソケット メッセージ: 0
    受信したソケット メッセージ: 0
    配信された信号: 0
    ページ サイズ (バイト): 4096
    終了ステータス: 0
于 2008-09-29T19:22:29.333 に答える
1

それらを1000回実行し、実際にかかった時間を測定して、結果を平均します。これにより、サーバーで実行されている他のアプリケーションによる差異がスムーズになります。

于 2008-09-29T17:58:59.330 に答える
1

ついに見つけたようです。

NAME回-プロセス時間を取得

概要#include

   clock_t times(struct tms *buf);

説明times()は、bufが指す構造体tmsに現在のプロセス時間を格納します。構造体tmsは、次のように定義されています。

   struct tms {
          clock_t tms_utime;  /* user time */
          clock_t tms_stime;  /* system time */
          clock_t tms_cutime; /* user time of children */
          clock_t tms_cstime; /* system time of children */
   };

子供の時間は、すべての待機中の子供を再帰的に合計したものです。

なぜまだ標準のCLIユーティリティになっていないのだろうか。または私はただ無知なのかもしれません。

于 2008-10-01T09:43:29.257 に答える
0

システムコマンドの前に「time -o somefile」を追加し、メインプログラムの時間を計って合計を取得することによって与えられた時間に追加することにおそらく傾いています。これを何度も行う必要がなければ、2 つの時間出力を取得して画面に追加する方法を見つけます (awk、シェル、perl などを使用)。

于 2008-09-29T18:05:46.803 に答える