Задать вопрос
@Atlllantis

Алгоритм расчёта оставшегося времени выполнения операции?

Всем привет.
Есть некая длительная (и не очень) операция, будь-то выполнение кода или загрузка файлов (без разницы).
В общем нужно как-то рассчитать оставшееся время выполнения операции.
Я беру данные за последние 30 секунд и на их основе считаю оставшееся время.
Вроде бы всё сделал, но скорость выполнения не постоянна и постоянно меняется, отсюда и оставшееся время постоянно скачет.
Теперь осталось как-то сгладить эти колебания, но никак не могу придумать - как это сделать.
Мо ж кто подскажет?
  • Вопрос задан
  • 403 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Прогноз можно сделать инертным.

По событию обновления прогресса (очередной чанк загрузился) скачкообразно меняется значение ожидаемого конца finish_forecast.

Переменная finish_forecast_display это прогнозируемый момент окончания для показа. Исходя из него и текущего времени плавно обновляем индикатор прогресса.

Чтобы не было дерганий, finish_forecast_display обновляем не мгновенно, а раз в фикс. интервал времени (раз в 200 ms) двигаем его в сторону текущего значения finish_forecast на дельту, пропорциональную расстоянию - чем ближе, тем медленнее. Тут важна регулярность этих интервалов обновления дисплея.

Так скорость прогресс-бара будет плавно ускоряться или замедляться, но скачков не будет.

Похожий эффект в 2D использовал в эмуляции полёта насекомого. Там случайная точка задаёт цель, к которой стремится муха. В примере, правда, не сама муха, а перед ней ещё несколько звеньев невидимой цепочки преследования. Но принцип тот же:

C ---> N . . . . . . . . . . . T
T - только что заданный новый момент окончания процесса total * time_passed / current_progress
C - показываем прогресс бар исходя из этого ожидаемого момента конца всего процесса
N - в следующем "кадре" С примет значение N.

N = C + (T - C) / 100
Ответ написан
Комментировать
keydon2
@keydon2
...
  • Брать интервал больше 30 секунд(можно увеличивать интервал в процессе).
  • Если операции примерно одинаковые, то можно попробовать посчитать этап1 на одном железе, посчитать суммарное время.
    На втором железе замерить этап1 и пропорционально предсказывать суммарное время(суммарноевремя2=суммарноевремя1*(этап1железо2/этап1железо1).
  • Отфильтровывать быстрые изменения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы