У меня есть некоторые таймеры, которые измеряют время для выполнения кода.
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).
Предположим, что каждое действие в вашем операторе 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);
Вы можете сделать автокорректирующее предположение, если имеется достаточно операций, каждая из которых может быть рассчитана по времени индивидуально и каждая занимает примерно одинаковое время. Начните с предположения и умножьте на количество операций, которые необходимо выполнить. Измерьте время следующей операции и добавьте это в список. Сделайте новое предположение, взяв среднее значение времени в этом списке и умножив его на количество оставшихся операций.
Ваше предположение станет более точным по мере того, как вы получите больше отсчетов времени. И ваш индикатор выполнения всегда будет достигать 100% (+/- немного). Лучше использовать медианное значение вместо среднего, оно устраняет выбросы из-за внезапной активности на вашем компьютере других процессов. И вы захотите выбросить старые измерения в списке, достаточно оставить только 10-20. Сохраните больше образцов, если время операции более изменчиво.
Чтобы получить лучшее представление времени для производительности кода (в красивом TimeSpan
), взгляните на System.Diagnostics.StopWatch
.
Он работает так, как вы и ожидали: Start()
для начала отсчета времени, Stop()
для остановки. Считайте Elapsed
, чтобы получить TimeSpan
времени, или ElapsedTicks
для наиболее точного измерения (TimeSpan. Ticks
= 1.0 x 10-9 сек, или 100 наносекунд; ElapsedTicks
является переменной и соотносится с StopWatch.Frequency
в 1 сек/значение).