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) {

会工作。您将计算iterationCycle和 1024 的按位与,只有每次第 10 位的位为 1 时才返回正数。这类操作的完成速度非常快,因为您的 CPU 具有特定的硬件。

于 2012-10-23T14:06:33.200 回答
0

这个你可能想多了。我只会在您的主应用程序代码的每个循环中输出一个字符。运行一些测试看看有多少(亿?百万?),但你不应该打印超过每秒一次。然后做:

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

你真的应该检查“效率”,但几乎相同的 ist 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 回答