У меня есть программа на C++ с длинным ходом. Он имеет около 500000 итераций. Я хотел бы распечатать прогресс каждые 5%.Успех печати C++ с минимальным воздействием на время выполнения
Что я до сих пор ниже. Проблема заключается в том, что он будет продолжать писать одну и ту же строку (0%,% 5 и т. Д.) Снова и снова. Это связано с тем, что после усечения процента в целое число есть 1000 итераций, которые будут поражены кратным 5. Это делает программу заметно медленнее.
С другой стороны, если я не укоротить до целого числа, то результат percent % 5.0
вряд ли будут точно 0.
Как я могу напечатать индикатор прогресса с минимально возможным влиянием на время выполнения?
// Counters for progress indicator
int i = 0;
float totalWindows = (float)(win.nX * win.nY);
int percent;
while (win.next() == 0)
{
// Read the data
// Nicely formatted progress indicator
i++;
percent = (i/totalWindows) * 100;
if (percent % 5 == 0)
{
std::cout << "\r" << std::string(percent/5, '|') << percent << "%";
std::cout.flush();
}
}
EDIT: Спасибо за ответы. Я отправился с христианами, которые пришли к наименьшему количеству инструкций. Он побрил 25% времени выполнения, поэтому довольно значителен!
totalWindows остается без изменений, да. Умное решение, мне нравится использование обратного отсчета – jramm
@ Christophe - Я думаю, что в вашем коде есть небольшая проблема.'Cout' использует конструктор заполнения строки, используя переменную' percent', которая не является частью вашего кода. Может быть, вы хотите вместо этого 'percent5 * 5'. – 4386427
@StillLearning точное! Спасибо, я отредактировал ответ :-). Кстати, чтобы избежать alloc/dealloc временной строки, можно было бы рассмотреть возможность создания строковой переменной вне цикла, зарезервировать достаточную емкость для нее, и каждое взаимодействие добавит '|' в конце строки. Но это улучшение было бы незначительным, так как этот код выполняется только 20 раз. – Christophe