1

現在、コマンドライン C プログラムを作成しています。私のプログラムには、複雑なループと計算がたくさんあります。ここで、私のプログラムが計算を完了するのに約 2 分かかるという問題が発生するため、計算中に何かを印刷して、それがうまく実行されていることを示したいと思います。そうしないと、プログラムは 2 分間無音で実行され、ユーザーはクラッシュすると思うかもしれません。

ただし、特定の値をメインループに出力するコード行を単純に挿入すると、プログラムが大幅に遅くなります (printf関数が画面に影響を与えるまでコードが待機するためだと思います)。

今、私は機能的ですが本当に醜い解決策を持っています。つまり、1000ループごとに1回印刷します。私にとって、この問題の理想的な解決策は、ステータスをパーセンテージで出力し、同時にバックグラウンドでコードを実行することです。sudo apt-get update( Linuxで実行するのと同じように)

4

3 に答える 3

0

プログラムのステータスとなる整数(または非常に小さい数値の場合はより正確なデータ型)を持つことを検討できます。パーセンテージを増やしたいときはいつでも、簡単に行うことができますidentifier++。が変更されたかどうかを検出するバックグラウンド プロセスを実行identifierし、新しいパーセンテージを画面に出力する関数を呼び出す必要もあります。

これは非常に単純化されたソリューションであり、おそらく論理的に推測するのが最も簡単なソリューションですが、これを実装するには多くの方法 (およびはるかに正確で効率的な方法) があります。

于 2013-08-09T06:21:42.040 に答える
0

シンプルなシングル スレッド ソリューションは、x (例: 1000) ループの反復ごとに、目的の次のステータス マイルストーン (例: 1%) に到達したかどうかを確認し、ステートメントを出力することです。必要に応じて、少なくとも (半分) 秒が経過したかどうかを確認します。

#include <sys/time.h>

struct timeval last, now;
gettimeofday(&last, NULL);
size_t lastprint = 0;

size_t i;
for (i = 0; i < num_iterations; i++) {
    if (!(i & 0x3FF)) { // every 1024 iterations
        if ( 100 * (i - lastprint) / num_iterations >= 1) { // at least one percent passed
            gettimeofday(&now, NULL);

            if (now.tv_usec - last.tv_usec + (1000000 * (now.tv_sec - last.tv_sec)) > 500000) { // at least half a second passed
                // print status

                last = now;
                lastprint = i;

            }
        }
    }

    // do work
}

ループの反復にかかる時間に応じて、パフォーマンスに影響する場合としない場合があります。経験則として、ループの実行に 20 ナノ秒以上かかる場合は、これで問題ありません。

ループが小さすぎて、ステータス メッセージ用に余分なブランチを作成する余裕がない場合は、

  • 最初にコードの並列化を検討する必要があります
  • 反復インデックスを共有変数に入れ、(0.5) 秒ごとにステータス印刷スレッドでチェックし、このようなステータス メッセージを出力する必要があります。
于 2013-08-09T10:59:22.580 に答える