Во многих приложениях у нас есть некоторые индикаторы выполнения для загрузки файла, задачи сжатия, поиска и т.д. Мы все часто используем индикаторы выполнения, чтобы пользователи знали, что что-то происходит. И если мы знаем некоторые детали, например, сколько работы было проделано и сколько еще осталось сделать, мы можем даже дать оценку времени, часто путем экстраполяции того, сколько времени потребовалось, чтобы добраться до текущего уровня прогресса.
(источник: jameslao.com)
Но мы также видели программы, которые отображают "оставшееся время" "ETA" просто комично. Он утверждает, что копирование файла будет выполнено через 20 секунд, затем через одну секунду он скажет, что это займет 4 дня, затем он снова начнет мигать и будет 20 минут. Это не только бесполезно, это сбивает с толку! Причина, по которой ETA варьируется так сильно, заключается в том, что скорость выполнения может меняться, а математика программиста может быть слишком чувствительной.
Apple обходит это, просто избегая любых точных прогнозов и просто давая неопределенные оценки!
(источник: autodesk.com)
Это тоже раздражает, у меня есть время для быстрого перерыва, или моя задача будет выполнена еще через 2 секунды? Если прогноз слишком нечеткий, делать какой-либо прогноз вообще бессмысленно.
Простые, но неправильные методы
В качестве первого вычисления ETA, вероятно, мы все просто создаем функцию, например, если p - это уже сделанный дробный процент, а t - время, которое потребовалось до сих пор, мы выводим t * (1-p)/p в качестве оценки сколько времени это займет, чтобы закончить. Это простое соотношение работает "ОК", но оно также ужасно, особенно в конце вычислений. Если из-за низкой скорости загрузки происходит медленное продвижение копии в одночасье и, наконец, утром, что-то срабатывает, и копия начинает работать на полной скорости со скоростью 100Х, ваш ETA на 90% завершится, может сказать "1 час" и 10 секунд позже вы наберете 95%, и ETA скажет "30 минут", что явно смущающе плохое предположение… в этом случае "10 секунд" - намного, намного, лучшая оценка.
Когда это происходит, вы можете подумать о том, чтобы изменить вычисление, чтобы использовать последнюю скорость, а не среднюю скорость, чтобы оценить ETA. Вы берете среднюю скорость загрузки или скорость завершения за последние 10 секунд и используете эту частоту, чтобы прогнозировать, как долго будет выполняться. Это довольно хорошо работает в предыдущем примере "загрузка за ночь, который ускорился в конце", поскольку в конце он даст очень хорошие окончательные оценки завершения. Но у этого все еще есть большие проблемы... это заставляет ваш ETA сильно подпрыгивать, когда ваша скорость быстро меняется в течение короткого периода времени, и вы получаете "сделано за 20 секунд, сделано за 2 часа, сделано за 2 секунды, сделано за 30 минут "быстрое отображение позора программирования.
Актуальный вопрос:
Каков наилучший способ вычисления предполагаемого времени выполнения задачи, учитывая историю вычислений? Я не ищу ссылки на наборы инструментов GUI или библиотеки Qt. Я спрашиваю об алгоритме для генерации наиболее разумных и точных оценок времени завершения.
Был ли у вас успех с математическими формулами? Какое-то усреднение, может быть, с использованием среднего значения ставки за 10 секунд со скоростью более 1 минуты со скоростью более 1 часа? Какой-то искусственный фильтр типа "если моя новая оценка слишком сильно отличается от предыдущей оценки, уменьшите ее, не дайте ей слишком сильно отскочить"? Какой-то необычный анализ истории, в котором вы интегрируете прогресс и прогресс по времени, чтобы найти стандартное отклонение скорости, чтобы получить статистические показатели ошибок по завершении?
Что вы пробовали и что работает лучше всего?