我正在制作一些网格生成代码,在此期间我真的想看看我在哪里,所以我从互联网上下载了一段进度条形码,然后将其插入到我的代码中,例如:
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
。
我真的很生气,我想知道是否有更智能,更有效的方法将进度条打印到屏幕上。
万分感谢。
答案 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已经回答的那样,输出次数较少