2009-07-14 10 views
1

私はいくつかのプロファイリングテストを実行しており、usleepは便利な機能です。しかし、私のプログラムが眠っている間、この時間はプロフィールには現れません。アクティブなスリープを行うにはどうすればいいですか?

例えば、私はとしての機能を持っている場合:gprofのようにプロファイルツールで

void f1() { 
    for (i = 0; i < 1000; i++) 
     usleep(1000); 
} 

、f1は任意の時間を消費しているようだしません。あなたははusleepを呼び出す際にCPUが1秒間何か他のものに動作するように置かれているので

while (1) { 
    if (gettime() == whatiwant) 
     break; 
} 
+0

お返事ありがとうございます。たぶんそれは本当に明確ではなかったが、私は効率を気にしない、私はいくつかのテストを実行している(実際には、私はこれをtest.cファイルで使用する...)私は待機キューのスケジューリングなどを認識しています。私が探しているのは、私が更新したもののための既存の方法です。 –

答えて

2

システムのどのような種類がありますか? UNIXのようなシステムでは、setitimer()を使用して、指定された時間後にプロセスにシグナルを送信できます。これはあなたが探している "アクティブな睡眠"のタイプを実装する必要がある施設です。

タイマーを設定し、信号を受信するまでループします。

+0

すばらしい、まさに私が探しているもの!!ありがとう –

2

:私は探しています何

は次のように、アクティブな睡眠を行うためのwhileループの空よりもよりよい方法です。したがって、現在のスレッドはプロセッサリソースを使用しません。これは非常に巧妙なことです。

能動的な睡眠は、資源の浪費(最終的には電気を熱に変換することによって環境に害を与えるため)を絶対に避けるためのものです)。

もしあなたが本当にそれをしたいのであれば、コンパイラの最適化によって考慮されない何らかの実際の作業をプロセッサに与える必要があります。例

for (i = 0; i < 1000; i++) 
    time(NULL); 
2

のために私は(あなたが座っている時間が、あなたのアプリケーションの実行を見て、壁時計時間、実世界の時間)は、時間の合計を知りたいと仮定F1()とは対照的に、取っていますCPU時間に私はgpr​​ofがあなたに処理時間の代わりにウォールクロック時間を与えることができるか調べるために調査します。

私はあなたのOSに依存していると思いますが、それは技術的にはその時間中に何も使用していないためです。 * nixプラットフォームで動作します)。

+0

私はあなたがリアルタイム/壁時計の時間を意味すると思います。睡眠はユーザーの時間を使用すべきではありません。 – Nick

+0

@Nick - 真。編集しました。 –

+0

うーん、素敵な返信。 gprofで既に検索されている、それは不可能です。 –

1
for (int i = i; i < SOME_BIG_NUMBER; ++i); 

"スリープ"機能の全ポイントは、アプリケーションが実行されていないことです。これはスリープキューに置かれ、OSは制御を別のプロセスに移します。アプリケーションを実行したいが何もしない場合、空のループは単純な解決策です。しかし、スリープのすべての利点を失う(他のアプリケーションを実行させ、CPU使用率/消費電力を節約する)

だからあなたが求めていることは意味をなさない。アプリケーションをスリープ状態にすることはできませんが、実行中です。

+1

それがコンパイルされていれば、それは本当に強力な長いループになります。 :)あなたは "i ++"の部分を欠いています。 – unwind

+0

haha​​、oops – jalf

+0

彼は基本的に正しいです(またはC++ ly ??)私は大きな担当者と誰かが彼がしなければそれを修正すると確信しています! –

0

AFAIK唯一のオプションはwhileループを行うことです。オペレーティングシステムは、通常、オペレーティングシステムに降伏したい時間を待つことを前提としています。

マイクロ秒の正確なタイマーを取得できることも潜在的な問題です。 AFAIKでは、クロスプラットフォームのタイミングを取る方法はありません(私はクロスプラットフォームのサブマイクロ秒タイマーが好きなので、誰かがこれを修正してください!:D)。 Win32では、ループ内で十分な時間を過ごしてから終了するときに、いくつかのQueryPerformanceCounter呼び出しでループを囲むことができます。

例えば

void USleepEatCycles(__int64 uSecs) 
{ 
    __int64 frequency; 
    QueryPerformanceFrequency((LARGE_INTEGER*)&frequency); 
    __int64 counter; 
    QueryPerformanceCounter((LARGE_INTEGER*)&counter); 

    double dStart = (double)counter/(double)frequency; 
    double dEnd = dStart; 
    while((dEnd - dStart) < uSecs) 
    { 
     QueryPerformanceCounter((LARGE_INTEGER*)&counter); 
     dEnd = (double)counter/(double)frequency; 
    } 
} 
0

"Switched Out%"時間をプロファイリングする際に重要なのはそのためです。基本的に、あなたの関数の排他的な時間はほとんどないかもしれませんが、例えば、 I/O、DBなど、外部リソースを待っている場合は、「Switched Out%」が注意するメトリックです。

0

これはgprofとの混乱の一種です。気になるのは壁時計の時間なので、これは一種の混乱です。私はthisを使用します。

関連する問題