Если вам нужны какие-то точные, «приятные» оценки, вы, вероятно, можете делать всевозможные сложные и причудливые вещи. Мне только нужно сделать это, чтобы я мог решить, нужно ли мне перекусить во время моей программы, или я должен сидеть там и ждать его. Поэтому мне достаточно получить очень грубое представление о том, займет ли у вас несколько секунд (подождите), минут (перекусить или выпить кофе), часов (время для обеда!) Или дней (возможно, мне нужно немного оптимизировать это. .).
Большая часть моего кода с интенсивным временем работы, как правило, представляет собой цикл for с множеством итераций. Поэтому я просто смотрю, сколько итераций есть, сколько я сделал, и сколько времени это взяло меня.Там у меня есть ключевое решение, это либо:
1) Время завершения итерации существенно не коррелирует с индексом итерации, и в этом случае t_remaining = (t_elapsed/finished_iterations)*remaining_iterations
.
2) Индекс связан с временем на итерацию (представьте себе сортировку массива a путем нахождения максимума и добавления его в массив b, удаление этого элемента из a и повторение нахождения максимума будет быстрее и быстрее как вы продолжаете). В этом случае я бы использовал (мне еще не нужно было) t_remaining = t_last_iteration*remaining_iterations
.
У меня есть быстрая и грязная функция Matlab, которую я вызываю в конце моего блока с конечным условием цикла и текущей итерацией в качестве параметров. Он печатает информацию о какой процент цикла делается и сколько времени это, вероятно, потребуется (с использованием метода 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
Он имеет много недостатков, но они очевидны.