Как мы можем оценить время, необходимое для завершения программы, и отразить это на индикаторе прогресса? - PullRequest
2 голосов
/ 15 декабря 2010

Это не зависит от языка программирования.

Мне просто нужно понять, как я могу оценить время, необходимое для завершения процесса? Например, распаковать файл или записать компакт-диск? Каковы факторы, которые повышают точность этого расчета?

Некоторые примеры на любом языке программирования, конечно, помогут.

Ответы [ 5 ]

2 голосов
/ 15 декабря 2010

Иногда вы просто не можете оценить время, необходимое для завершения процесса.Вы можете придумать все виды схем, чтобы оценить это время, но если вы ошибетесь, вы рискуете показать индикатор выполнения, который работает до конца и сидит там.Это только разочарует пользователя.

В этих случаях лучше всего выбрать один из множества доступных элементов графического интерфейса, чтобы убедиться, что пользователь занят приложением, работая над ним.

1 голос
/ 15 декабря 2010

Запишите фактическое время и соответствующие факторы;оцените будущее время, основываясь на средних значениях прошедших запусков в аналогичных ситуациях.В большинстве случаев это никогда не будет настолько точным, но я полагаю, это лучше, чем ничего.

Как вы говорите, это не зависит от языка, но это очень ситуация;факторы, относящиеся к записи диска, вероятно, отличаются от факторов, влияющих на время распаковки файла.

0 голосов
/ 28 января 2012

Если вам нужны точные, «приятные» оценки, вы, вероятно, можете делать всевозможные сложные и причудливые вещи. Мне нужно сделать это только для того, чтобы я мог решить, должен ли я перекусить, пока работает моя программа, или я должен сидеть там и ждать ее. Так что мне достаточно, чтобы получить очень грубое представление о том, займут ли секунды (ожидание), минуты (перекусить или выпить кофе), часы (время на обед!) Или дни (возможно, мне следует немного оптимизировать эту задачу). .).

Большая часть моего трудоемкого кода, как правило, представляет собой цикл 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

У него много недостатков, но они очевидны.

0 голосов
/ 15 декабря 2010

Что бы вы ни делали, убедитесь, что вы не обманываете, как это делает проводник Windows, создавая экспоненциально увеличивающийся индикатор выполнения, который никогда не заполняется - это гораздо более раздражает, чем индикатор выполнения.1003 *

0 голосов
/ 15 декабря 2010

Я не особо много сделал с оценками времени, но могу сказать, что, по моему мнению, следует учитывать.

Временная сложность алгоритма: алгоритм O (n * n)займет в n раз больше, чем алгоритм O (n).Скорее всего, вам нужно будет знать детали реализации того, что вы оцениваете.Оценки времени вашей программы будут пропорциональны тактовой частоте компьютера, на котором он работает, скорости жесткого диска, тактовой частоты памяти, скорости интернета, а в случае записи диска - скорости дисковода.Если компьютер вашего пользователя движется со скоростью, близкой к скорости света, вам придется учитывать такие вещи, как особая теория относительности, но, надеюсь, это не так.Большинство из них могут быстро измениться, а другие трудно получить оценку в первую очередь.На самом деле слишком много факторов влияют на то, сколько времени займет программа.Например, другие программы могут замедлить вашу работу, и я думаю, что это действительно трудно принять во внимание.

Извините, я не могу придумать ни одного примера кода, который бы сопровождал это, чтобы продемонстрировать вещи лучше.Надеюсь, это поможет.

...