寻找一种更有效的方法来生成/打印C ++中的“进度条”

时间:2012-10-23 14:02:23

标签: c++

我正在制作一些网格生成代码,在此期间我真的想看看我在哪里,所以我从互联网上下载了一段进度条形码,然后将其插入到我的代码中,例如:

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

我真的很生气,我想知道是否有更智能,更有效的方法将进度条打印到屏幕上。

万分感谢。

3 个答案:

答案 0 :(得分:3)

首先,您可以考虑仅在每100或1000次迭代中更新它。其次,我不认为划分是瓶颈,而是字符串操作和输出本身。

我想唯一重要的改进是输出

哦,只是为了好的衡量 - 一个有效的方法来执行每次(例如1024次迭代)的代码,不会看到1024是否是使用模运算的除数,而是使用按位调用。

的内容
if (iterationCycle & 1024) {

会奏效。你将计算iterationCycle和1024的按位AND,只有每次第10个位的位为1时才返回正数。这类操作完成得非常快,因为你的CPU有特定的硬件用于它们。

答案 1 :(得分:0)

你可能会过度思考这个问题。我只会在主应用程序代码的每个循环中输出一个字符。运行一些测试来查看有多少(几百万?),但是你不应该打印超过每秒一次。然后就做:

std::fputc('*', stdout);
std::fflush(stdout);

答案 2 :(得分:0)

你应该真的检查“效率”,但是什么会起作用几乎相同的是boost.progress:

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

并且正如Joost已经回答的那样,输出次数较少