Как оценить, что время окончания метода в WinForms правильно сообщает пользователю в предсказанное время конца?

У меня есть некоторые таймеры, которые измеряют время для выполнения кода.

 DateTime startTimeFunctionTotal = DateTime.Now;
     for (int i = 0; i < array.Count; i++) {
         DateTime startTimeFunction = DateTime.Now;
         //some code here

          DateTime stopTimeFunction = DateTime.Now;
          TimeSpan durationTimeFunction = stopTimeFunction - startTimeFunction ;

 }
 DateTime stopTimeFunctionTotal = DateTime.Now;
 TimeSpan durationTimeFunctionTotal = stopTimeFunctionTotal - startTimeFunctionTotal ;

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

Я хотел бы дать пользователю предсказанное время конца (и время как 15 минут и 10:56).

5
задан John Saunders 1 March 2010 в 21:22
поделиться

3 ответа

Предположим, что каждое действие в вашем операторе for занимает примерно одинаковое количество времени:

List<TimeSpan> timeSpans = new List<TimeSpan>();
for(int i = 0; i < array.Count; i++)
{
    Stopwatch watch = Stopwatch.StartNew();
    //do stuff
    timeSpans.Add(watch.Elapsed);
    long ticksLeft = timeSpans.Sum(ts => ts.Ticks) * (array.Count - i) / timeSpans.Count;
    Console.WriteLine("Left: " + new TimeSpan(ticksLeft));
    Console.WriteLine("Finished in: " + 
        DateTime.Now.AddTicks(ticksLeft));
}

Чтобы использовать среднее значение:

long ticksLeft = timeSpans.OrderBy(ts => ts.Ticks)
    .ElementAt(timeSpans.Count / 2).Ticks * (array.Count - i);
3
ответ дан 14 December 2019 в 13:33
поделиться

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

Ваше предположение станет более точным по мере того, как вы получите больше отсчетов времени. И ваш индикатор выполнения всегда будет достигать 100% (+/- немного). Лучше использовать медианное значение вместо среднего, оно устраняет выбросы из-за внезапной активности на вашем компьютере других процессов. И вы захотите выбросить старые измерения в списке, достаточно оставить только 10-20. Сохраните больше образцов, если время операции более изменчиво.

2
ответ дан 14 December 2019 в 13:33
поделиться

Чтобы получить лучшее представление времени для производительности кода (в красивом TimeSpan), взгляните на System.Diagnostics.StopWatch.

Он работает так, как вы и ожидали: Start() для начала отсчета времени, Stop() для остановки. Считайте Elapsed, чтобы получить TimeSpan времени, или ElapsedTicks для наиболее точного измерения (TimeSpan. Ticks = 1.0 x 10-9 сек, или 100 наносекунд; ElapsedTicks является переменной и соотносится с StopWatch.Frequency в 1 сек/значение).

1
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

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