1

私はいくつかのグリッド生成コードに取り組んでいますが、その間に自分がどこにいるかを実際に確認したいので、インターネットから進行状況バーコードをダウンロードして、次のようなコードに挿入します。

std::string bar;

for(int i = 0; i < 50; i++)
{
    if( i < (percent/2))
    {
        bar.replace(i,1,"=");
    }
    else if( i == (percent/2))
    {
        bar.replace(i,1,">");
    }
    else
    {
        bar.replace(i,1," ");
    }
}

std::cout<< "\r" "[" << bar << "] ";
std::cout.width( 3 );
std::cout<< percent << "%     "
    << " ieration: " << iterationCycle << std::flush;

これは非常に簡単です。ただし、プロセス全体が大幅に遅くなることに注意してくださいpercent=iterI/nIter

私は本当にこれに悩まされています.プログレスバーを画面に表示するためのよりスマートで効率的な方法があるかどうか疑問に思っています.

どうもありがとう。

4

3 に答える 3

3

まず、100回または1000回の反復ごとにのみ更新することを検討できます。第二に、分割がボトルネックだとは思いませんが、むしろ文字列操作と出力そのものです。

唯一の大幅な改善は、出力の頻度を減らすことだと思います。

ああ、ちょうど良い尺度です-たとえば1024回の反復ごとにのみコードを実行する効率的な方法は、モジュロ演算を使用して1024が除数であるかどうかを確認するのではなく、ビットごとの呼び出しを使用することです。の線に沿った何か

if (iterationCycle & 1024) {

動作します。と 1024のビットごとの AND を計算iterationCycleし、10 番目の位置のビットが 1 になるたびに正を返すだけです。CPU には特定のハードウェアがあるため、これらの種類の操作は非常に高速に実行されます。

于 2012-10-23T14:06:33.200 に答える
0

あなたはこれを考えすぎているかもしれません。メインアプリケーションコードの何サイクルにもわたって1文字を出力するだけです。いくつかのテストを実行してその数 (数億? 数百万?) を確認しますが、1 秒に 1 回以上印刷しないでください。次に、次のようにします。

std::fputc('*', stdout);
std::fflush(stdout);
于 2012-10-23T14:09:09.563 に答える
0

「効率」を実際に確認する必要がありますが、ほとんど同じように機能するのは、boost.progress です。

#include <boost/progress.hpp>
...
boost::progress_display pd(50);
for (int i=0; i<=60; i++) {
 ++pd;
}

Joostがすでに回答したように、出力の頻度は少なくなります

于 2012-10-23T14:09:10.070 に答える