7

通常、大きな for ループがある場合、プログラムがプロセスのどの部分にあるかを知らせるメッセージを入れます。たとえば、次のようになります。

for(i = 0; i < large_n; i++) {
    if( i % (large_n)/1000 == 0) {
       printf("We are at %ld \n", i);
    }
    // Do some other stuff
}

これがパフォーマンスに大きな影響を与えるかどうか (アプリオリに) と、よりスマートな代替手段があるかどうか疑問に思っていました。よろしくお願いします。

4

6 に答える 6

5

時々だけ状態をチェックするために大きなループを分割できるかもしれませんが、これが本当に時間を節約できるかどうかはわかりません。それはあなたの「他のもの」にもっと依存します。

int T = ...; // times to check the condition, make sure large_n % T == 0
for(int t = 0; t < T; ++t)
{
  for(int i = large_n/T * t; i < large_n/T * (t+1); ++i)
  {
    // other stuff
  }
  printf("We are at %ld \n", large_n/T * (t+1));
}
于 2013-07-02T13:29:44.233 に答える
4

ループの内容に関係なくprintf、アプリケーション/ユーザーにとって不可欠でない限り、のようなステートメントを残しifたり、同じ理由で実質的に冗長なステートメントを使用したりしません。

これらは両方とも、トレース レベルのデバッグの例です。それらは完全に有効で、場合によっては非常に便利ですが、一般的に最終的なアプリケーションではそうではありません。この点で、通常行うべきことは、それらが提供する情報を実際に使用したい場合にのみビルドに含めることです。この場合、次のようにすることがあります。

#define DEBUG

for(i = 0; i < large_n; i++) 
{
    #ifdef DEBUG
        if( i % (large_n)/1000 == 0) 
        {
            printf("We are at %ld \n", i);
        }
    #endif
}

これらのデバッグ出力を常に含めることのパフォーマンスコストに関しては、実行しているシステム、データの出力に使用している「印刷」ステートメントの効率、実行しているチェックに完全に依存しますそしてもちろん、出力を実行しようとしている頻度。

于 2013-07-02T13:39:26.737 に答える
0

問題は、プロセッサが計算するよりも IO 操作printfに時間がかかることです。それらをすべて追加して最終的に印刷できれば、時間を短縮できます。

于 2013-07-02T13:48:01.080 に答える
0

for ループ内に print ステートメントを配置すると、パフォーマンスがいくらか犠牲になります。

メッセージが表示されるたびに、プログラムはシステム コールを実行して出力を画面に書き込む必要があるため、プログラム自体の CPU 時間が奪われます。

これら 2 つのループのパフォーマンスの違いを確認できます。

int i;
printf("Start Loop A\n");
for(i = 0; i < 100000; i++) {
    printf("%d ", i);
}
printf("Done with Loop A\n");

printf("Start Loop B\n");
for(i = 0; i < 100000; i++) {
    // Do Nothing
}
printf("Done with Loop B\n");

タイミングコードを含めますが、私は仕事の途中であり、後で昼食時に更新できます.

違いが目立たない場合は、100000 をより大きな数に増やすことができます (ただし、数が大きすぎると、最初のループが完了するまでに時間がかかりすぎます)。

おっと、私の答えを終えるのを忘れていました。

プログラムが必要とするシステム コールの数を減らすには、最初に条件をチェックし、その条件が true の場合にのみ出力します。

たとえば、私のコード例のように数え上げていた場合、以下を使用して 100 番目ごとの数値のみを出力できます%

int i;
for(i = 0; i < 100000; i++) {
    if(i%100 == 0)
        printf("%d", i);
}

これにより、syscall の数が ~100000 から ~1000 に減少し、ループのパフォーマンスが向上します。

于 2013-07-02T13:40:27.430 に答える