Если вам нужны точные, «приятные» оценки, вы, вероятно, можете делать всевозможные сложные и причудливые вещи. Мне нужно сделать это только для того, чтобы я мог решить, должен ли я перекусить, пока работает моя программа, или я должен сидеть там и ждать ее. Так что мне достаточно, чтобы получить очень грубое представление о том, займут ли секунды (ожидание), минуты (перекусить или выпить кофе), часы (время на обед!) Или дни (возможно, мне следует немного оптимизировать эту задачу). .).
Большая часть моего трудоемкого кода, как правило, представляет собой цикл for со многими итерациями. Поэтому я просто смотрю, сколько итераций, сколько я сделал и сколько времени это заняло у меня. Там мне нужно принять ключевое решение, либо:
1) Время завершения итерации существенно не коррелирует с индексом итерации, в этом случае t_remaining = (t_elapsed / finished_iterations)*remaining_iterations
.
2) Индекс связан с временем на итерацию (представьте, что сортировка массива a производится путем нахождения максимума и добавления его к массиву b, удаления этого элемента из a и повторного нахождения максимума будет происходить быстрее и быстрее, так как ты продолжай). В этом случае я бы использовал (мне никогда не нужно было) t_remaining = t_last_iteration*remaining_iterations
.
У меня есть быстрая и грязная функция Matlab, которую я вызываю в конце моего блока for с условием завершения цикла и текущей итерацией в качестве параметров. Он печатает информацию о том, какой процент цикла выполнен и сколько времени это, вероятно, займет (используя метод 1 выше):
function Progress(now, final)
% Call at inside a time-intensive for-loop with the current i (or other
% counter) in now and the final bound of the loop in final. This function
% will decide whether the rounded percentage has increased, and if it has,
% print progress information to the console.
%
% This expects loops to start at 1 and go up. Transform your variables
% accordingly if that is not the case - if the first time you call this
% function, the first argument isn't 1, you're in trouble.
%
% The aim of this function is to provide feedback on the progress of the
% loop, while making sure exactly 100 lines are printed, regardless of the
% number of iterations in the loop.
if now == 1
tic;
end
t_elapsed = toc;
nowPercent = round(100 * now / final);
oldPercent = round(100 * (now - 1) / final);
% Calculation rate = (total iterations so far)/(total time passed so far)
if nowPercent > oldPercent
t_remaining = round((t_elapsed / now * (final - now)) / 6) / 10;
disp([num2str(nowPercent) '% complete, estimated ' ...
num2str(t_remaining) ' minutes remaining...']);
end
end
Код Matlab довольно понятен, на мой взгляд. Немного менее очевидная вещь: tic
запускает секундомер, а toc
возвращает время, прошедшее с момента последнего tic
.
Вы бы использовали это так:
n = size(inputs);
for i = 1:n
do_complicated_calculation(inputs(i));
Progress(i, n);
end
У него много недостатков, но они очевидны.