3

連続して繰り返すと時間を「無駄にする」ことができる簡単な操作/ルーチンを探しています。

私はgpr​​ofがアプリケーションをどのようにプロファイリングするかを研究しているので、この「時間の浪費」はユーザースペースで時間を無駄にする必要があり、外部ライブラリを必要としないはずです。IE、sleep(20)を呼び出すと、20秒の時間が「無駄」になりますが、gprofは別のライブラリ内で発生したため、今回は記録しません。

時間を無駄にするために繰り返すことができる単純なタスクの推奨事項はありますか?

4

4 に答える 4

6

CPUを譲らずに時間を「無駄にする」最も簡単な方法は、タイトループです。

無駄の期間を制限する必要がない場合(たとえば、完了したらプロセスを終了するだけで制御できます)、Cスタイルに進みます*

for (;;) {}

(ただし、この標準では、プログラムが最終的に終了することを実装で想定できるため、技術的に言えば、このループ(少なくともC ++ 0xでは)の動作は未定義であり、最適化できることに注意してください。**

それ以外の場合は、手動で時間を計ることができます。

time_t s = time(0);
while (time(0) - s < 20) {}

または、timesyscallを繰り返し発行する代わりに(カーネルで時間がかかることになります)、GNU互換システムでは、 signal.h 「アラーム」を使用してループを終了できます。

alarm(20);
while (true) {}

「ハンドラーの戻り値」のドキュメントページにも、非常によく似た例があります。

(もちろん、これらのアプローチはすべて、その間に100%CPUに移動し、ふわふわのユニコーンが耳から落ちるようになります。)


*わかりやすくするために、意図的に使用される{}トレーリングではなく。;最終的に、このようなコンテキストでセミコロンを作成する言い訳はありません。入り込むのはひどい習慣であり、「実際の」コードで使用するとメンテナンスの落とし穴になります。

**およびを参照[n3290: 1.10/2]してください[n3290: 1.10/24]

于 2011-08-18T10:02:46.720 に答える
6

Tomalakのソリューションのもう1つのバリエーションは、アラームを設定することです。したがって、ビジーウェイトループでは、システムコールを発行し続ける必要はなく、信号が送信されたかどうかを確認するだけです。

于 2011-08-18T10:05:44.907 に答える
0

単純なループで十分です。gprofがどのように機能するかを研究している場合は、ゆっくりと注意深く論文を読んだと思います。また、あなたはこれらの問題に精通していると思います。

于 2011-08-18T13:03:31.650 に答える
0

これは、最新のハードウェアで反復ごとに1サイクルで実行されるビジーループです。少なくとも、少なくともいくつかの最適化フラグを備えた、またはおそらく任意の妥当なコンパイラによってコンパイルされます。clanggcc

void busy_loop(uint64_t iters) {
    volatile int sink;
    do {
        sink = 0;
    } while (--iters > 0);
    (void)sink;
}

volatile sinkアイデアは、すべての反復に保存することです。これにより、ループが最適化されるのを防ぎ、各反復に予測可能な量の作業(少なくとも1つのストア)を持たせることができます。最新のハードウェアはサイクルごとに1つのストアを実行でき、ループオーバーヘッドは通常、同じサイクルで並行して完了する可能性があるため、通常は反復ごとに1サイクルを達成します。itersしたがって、CPU速度(GHz)で割ることにより、特定の数にかかる実時間をナノ秒単位でボールパークすることができます。たとえば、3 GHzのCPUは、いつまでに約2秒(20億ナノ秒)かかりbusy_loopますiters == 6,000,000,000

于 2017-08-07T22:03:13.050 に答える