2016-10-21 21 views
-2

実行中のCプログラムの進行状況をパーセンテージで表示します。進行状況を測定するプログラムの実際の作業は、ループ内に限定されています。ここに私が試したものです:プログラムの実行中に完了の進行状況を表示

int i; 
int to = 100000000; 

while (i++ < to) { 
    printf("\rPercent done: %d", (100 * i)/to); 
} 
+1

地獄のように遅いですが、iを初期化するとうまくいくはずです。 –

+0

@カミカゼ、どうやって生きている?どこで更新されますか? – Josh

+1

あなたのコードが壊れているだけでなく、あなたは純粋な標準Cで要求することができません。あなたが好きな場所にコンソールカーソルを設定し、マルチスレッドを実装するためには、 。 – Lundin

答えて

7

はばかな質問かもしれませんが、 プログラムの実行中にどのように1は、進行状況を表示しますか?

このようではない。

あなたは複数の問題があります。

  • あなたiが初期化されていないので、プログラムがガベージを印刷しますが。 (修正: - >int i = 0;の代わりに
  • あなたの "進捗カウンター"は、ループ中の進行状況をカウントするだけです。 Percent done: 100が印刷されると、ループだけが終了します。
  • コンソールに1億回線を印刷しています。たぶんそれをもう一度考えてみてください。
  • (i*100)/toの場合、半分ほどの整数オーバーフローが発生するため、代わりにi/(to/100)を使用してください。コンパイラに依存して、コンパイラがそれを最適化することができることに注意してください。

少し嫌な方法は、次のようになります。

#include <stdio.h> 

int main (void) { 

    int i = 0; 
    int to = 100000000; 

    while (i++ < to) { 
     if (i % 1000000 == 0) { 
      printf("\rPercent done: %d", i/(to/100)); 
     } 
     dostuff(); 
    } 
    printf("\rLoop finished"); 
    return 0; 
} 

注これが唯一の正確なプログラムがループを実行してきたどこまで反映されますことを。ループ前後の作業はこれで測定されません。

これは、フル・パーセントごとにコンソール・メッセージを表示するだけです。あなたが100台のコンソールメッセージを受け取っているのは残念ですが、printfには100.000.000(!)のコールがあります。それでもなお、それはまだパフォーマンスに影響します。

関連する問題