2010-12-15 3 views
2

Это не язык программирования.Как мы можем оценить время, необходимое для завершения программы и отразить ее в индикаторе прогресса?

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

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

ответ

1

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

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

2

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

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

0

Я не очень много сделал с оценками времени, но могу сказать, что, на мой взгляд, нужно учитывать.

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

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

0

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

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^