Рассчитать оставшееся время - PullRequest
53 голосов
/ 23 января 2009

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

Ответы [ 15 ]

0 голосов
/ 03 марта 2017

Как насчет этого ...

Я использовал это, чтобы пройти через набор записей (строки в файле Excel, в одном случае)

L - текущий номер строки X - общее количество строк dat_Start устанавливается в Now (), когда процедура начинается

Debug.Print Format((L / X), "percent") & vbTab & "Time to go:" & vbTab & Format((DateDiff("n", dat_Start, Now) / L) * (X - L), "00") & ":" & Format(((DateDiff("s", dat_Start, Now) / L) * (X - L)) Mod 60, "00")
0 голосов
/ 09 октября 2013

Есть 2 способа показать время

  1. Прошедшее время и оставшееся время в целом: истекшее время будет увеличиваться, но оставшееся время, скорее всего, будет стабильным (если стабильно в секунду)

  2. Время истекло и осталось:
    так что оставшееся время = всего необходимо - прошло

Моя идея / формула более похожа на это:

Обработано - обновлено из запущенного потока с 0 до Всего

У меня есть таймер с интервалом 1000 мс, который вычисляет количество обработанных в секунду:

processedPerSecond = Processed - lastTickProcessed;
lastTickProcessed = Processed;  //store state from past call

processingPerSecond и lastTickProcessed - глобальные переменные вне метода таймера

Теперь, если мы хотим узнать, сколько секунд требуется для завершения обработки (в идеальном постоянном предположении) totalSecondsNeeded = TotalLines / PerSecond

но мы хотим показать случай 2. TimeLeft так TimeLeftSeconds = (Всего строк - обработано) / PerSecond

TimeSpan remaining = new TimeSpan(0, 0, (transactions.Count - Processed) / processedPerSecond);
labelTimeRemaining.Text = remaining.ToString(@"hh\:mm\:ss");

Конечно, TimeLeftSeconds будет «прыгать», если PerSecond прыгает, поэтому, если за PerSecond было 10, а затем 30, а затем до 10, пользователь увидит его.

Существует способ вычисления среднего значения, но он может не отображать реального времени, оставшегося в случае ускорения процесса в конце

int perSecond = (int)Math.Ceiling((processed / (decimal)timeElapsed.TotalSeconds));  //average not in past second

Таким образом, разработчик может выбрать «выбрать» метод, который будет наиболее точным на основе прогноза «нестабильной» обработки

Мы также можем рассчитать и сохранить каждую PerSecond, затем взять последние 10 секунд и сделать среднее значение, но в этом случае пользователю придется ждать 10 секунд, чтобы увидеть первый расчет или мы могли бы показать оставшееся время, начиная с первого в секунду, а затем прогрессивно усредняя, ​​суммируя до 10 в последнюю PerSecond

Надеюсь, мои "нервные" мысли помогут кому-то построить что-нибудь удовлетворяющее

0 голосов
/ 25 июня 2013

Я уже знал, что процент завершен и время истекло, поэтому мне это помогло:

TimeElapsed * ((100% выполнено) /% выполнено) = Оставшееся время

Затем я обновлял это значение каждый раз, когда менялся% complete, давая мне постоянно меняющееся ETA.

0 голосов
/ 23 января 2009

Если вы знаете процент выполнения и можете просто предположить, что время масштабируется линейно, что-то вроде

timeLeft = timeSoFar * (1 / Percentage)

может работать.

0 голосов
/ 23 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...