2

現在、ファイルをロードしてから gettimeofday を使用し、tv_usec で CPU 時間を追跡しています

私の結果はさまざまです。私は 250 から 280 を取得しますが、時には 300 や 500 を取得します。usleep と sleep (0) と (1) を書きましたが、成功しませんでした。時間はまだ大きく異なります。sleep(1) (Windows の Sleep in ms ではなく、Linux の秒数) で解決できると思いました。テストのために、より一貫した方法で時間を追跡するにはどうすればよいですか? 測定を開始する前に、はるかに大きなテストデータとより複雑なコードが得られるまで待つべきでしょうか?

4

3 に答える 3

4

Linux(および一般的にPOSIX)での高解像度時間に現在推奨されているインターフェースはclock_gettimeです。マニュアルページを参照してください。


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

しかし、manページを読んでください。POSIXがそう言っているので、-lrtとリンクする必要があることに注意してください。おそらく、独自のclock_gettimeを定義した古いプログラムの場合、-lcでのシンボルの競合を回避するためですか?しかし、動的ライブラリは弱いシンボルを使用します...

最高の睡眠機能はナノスリープです。信号やusleepのようながらくたをいじることはありません。それはただ眠ることと定義されており、他の副作用はありません。また、(信号などから)早く目が覚めたかどうかがわかるので、必ずしも別の時間関数を呼び出す必要はありません。

とにかく、システムコールを伴う短いものの1人の担当者をテストするのに苦労するでしょう。バリエーションの機会はたくさんあります。たとえば、スケジューラーは、他の作業が必要であると判断する場合があります(プロセスが開始されたばかりの場合は、タイムスライスをまだ使い切っていない可能性があります)。CPUキャッシュ(L2およびTLB)は簡単に可能です。

マルチコアマシンと、最適化するコードのシングルスレッドベンチマークがある場合は、コアの1つに固定されたリアルタイムの優先順位を与えることができます。割り込みを処理していないコアを選択するようにしてください。そうしないと、キーボード(およびその他すべて)が完了するまでロックアウトされます。タスクセット(1つのCPUに固定するため)とchrt(リアルタイムprioを設定するため)を使用します。このトリックでgmp-develに送信したこのメールを参照してください:http: //gmplib.org/list-archives/gmp-devel/2008-March/000789.html

そうそう、最も正確なタイミングのために、自分でrdtscを使用できます(x86 / amd64上)。ベンチングしているものに他のシステムコールがない場合、それは悪い考えではありません。関数を組み込むためのベンチマークフレームワークを入手してください。GMPにはかなりまともなものがあります。ただし、GMPに含まれておらず、mpn_whateverと呼ばれるベンチマーク関数には適切に設定されていない可能性があります。覚えていませんが、一見の価値があります。

于 2009-12-05T06:43:51.923 に答える
2

ファイルの読み込みにかかる時間を測定しようとしていますか? 通常、すでにかなり高速 (1 秒未満) のコードの一部のパフォーマンスをテストしている場合、同じコードを何度も (たとえば、1000 または 100 万) 繰り返し、全体の時間を計り、合計時間を反復回数で割ります。

そうは言っても、あなたが sleep() を何のために使用しているのかよくわかりません。あなたがやろうとしていることの例を投稿できますか?

于 2009-12-05T05:48:49.430 に答える
1

そのコードを for ループに入れることをお勧めします。1000 回または 10000 回繰り返して実行します。いくつかの命令しか実行していない場合、これには問題がありますが、役立つはずです。

もちろん、より大きなデータセットも役立ちます。

sleep は、CPU からスレッドのスケジュールを解除しようとしています。時間を正確に正確にカウントするわけではありません。

于 2009-12-05T05:49:09.713 に答える