Страница 1 из 1

Прогноз времени завершения

Добавлено: 08 апр 2009, 09:12
atavin-ta
Загружена многопоточная прилада. Пользователь дал команду, в результате запустился вторичный поток, а в нём - цикл со счётчиком. Эитот цикл имеет вложенные циклы со счётчиками (несколько уровнейц, неравномерное число шагов). После однократного выполнения всех шагов внешнего цикла вторичный поток завершается. Вторичный поток знает момент своего запуска вторичного потока и может читать системное время. Как написать функцию, вызываемую из вторичного потока, прогнозирующую момент его завершения? Причём, нужен не готовый исходник такой функции, а формулы, алгоритмы и тому подобные подсказки.

Re: Прогноз времени завершения

Добавлено: 20 апр 2009, 13:25
Unicuum
Если при запуске второго потока уже известно сколько будет циклов и по сколько то спрогнозировать не составит труда нужно только знать скорость выполнения операторов цикла. найти скорость можно экспериментальным путем, пусть во время запуска поток считывает системное время и в момент завершения тоже, разность значений и есть время выполнения потока, а так как количество итераций известно то и скорость легко получить.
Недостаток - первый запуск потока не прогнозируемый,
время остальных запусков уже расчитывается из полученной скорости

Другой вариант во время выполнения потока через некоторое количество итераций получать количество уже завершенных пройденное время и общее количество итераций.
Прогнозируемое время = кол_всего*пройд_время/кол_завершенных

Re: Прогноз времени завершения

Добавлено: 21 апр 2009, 06:45
atavin-ta
&quot писал(а):Если при запуске второго потока уже известно сколько будет циклов и по сколько то спрогнозировать не составит труда нужно только знать скорость выполнения операторов цикла. найти скорость можно экспериментальным путем, пусть во время запуска поток считывает системное время и в момент завершения тоже, разность значений и есть время выполнения потока, а так как количество итераций известно то и скорость легко получить.
Программа работает под многозадачной системой (windой), из-за чего скорость может меняться. Пиковая скорость выполнения каждого оператора постоянно, но из-за пауз, во время которых комп выполяет другие задачи, скорость выполнения любой длинной последоватьельности операций может меняться. Кроме того, каждое многопоточное приложение само многозадачно, что также даёт аналогичный эффект. Надо спрогнозировать время завершения вторичного потока именно в таких условиях.
&quot писал(а):Недостаток - первый запуск потока не прогнозируемый,
время остальных запусков уже расчитывается из полученной скорости
Прогноз при первом запуске на компе пользователя обязателен, второго запуска на этом компе может вообще не быть.
&quot писал(а):Другой вариант во время выполнения потока через некоторое количество итераций получать количество уже завершенных пройденное время и общее количество итераций.
Прогнозируемое время = кол_всего*пройд_время/кол_завершенных
Как это согласуется с неравномерностью числа шагов и с переменной скоростью?
Требуется не абсолютно точный в течении всего времени работы, а хоть какой-то правдоподобный прогноз, не задолго до завершения становящийся точным. Причём. прогнозатор должне автоматически реагировать на изменения скорости работы потока.
До обоих этих способов я и сам додумался, но они хороши только под DOSом, а надо для многомоточной windows-проги.

Re: Прогноз времени завершения

Добавлено: 21 апр 2009, 07:02
Unicuum
Точный прогноз получить сложно это факт, яркий пример это прогноз времени при копировании файлов (хоть это и слегка другая область)

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

Re: Прогноз времени завершения

Добавлено: 22 апр 2009, 13:07
atavin-ta
Специально притормаживать нельзя. И обрати внимание на фразу прогноз должен становиться точным незадолго до завершения. При копирожании файлов незадолго до завершения показывается что-то вроде "5 сек". При этом относитьльная погрешность прогноза, если её отнести не к истинному оставшемуся времени, а к истинной полной длительности, а копировать многомегабайтные каталоги, не превышает 1%. Следовательно это как раз пример точного прогноза. В то же время в самом анчале процесса копирования любых файлов прогноз времени завершения - пример негодного прогноза. Мне надо в вначале процесса написать "время завершения не известно", в середине - получить грубый, но близкий к истине прогноз, а ближе к концу - точный. Когда сделано как минимум 39/40 всей работы, а осталось не более 2 мин,погрешность оценки полной длительности исполнения должна быть не более 1/80. В том же случае погрешность оставшегося времени должна ограничивается величиной 200%. Как это сделать?