В качестве простого примера рассмотрим следующий (надуманный) пример:
double Mean(List<double> items)
{
double mu = 0;
foreach (double val in items)
mu += val;
return mu / items.Length;
}
Мы можем рассчитать время так:
void DoTimings(int n)
{
Stopwatch sw = new Stopwatch();
int time = 0;
double dummy = 0;
for (int i = 0; i < n; i++)
{
List<double> items = new List<double>();
// populate items with random numbers, excluded for brevity
sw.Start();
dummy += Mean(items);
sw.Stop();
time += sw.ElapsedMilliseconds;
}
Console.WriteLine(dummy);
Console.WriteLine(time / n);
}
Это работает, если список элементов на самом делеочень большой.Но если он слишком мал, нам нужно будет выполнить несколько прогонов за один раз:
void DoTimings(int n)
{
Stopwatch sw = new Stopwatch();
int time = 0;
double dummy = 0;
List<double> items = new List<double>(); // Reuse same list
// populate items with random numbers, excluded for brevity
sw.Start();
for (int i = 0; i < n; i++)
{
dummy += Mean(items);
time += sw.ElapsedMilliseconds;
}
sw.Stop();
Console.WriteLine(dummy);
Console.WriteLine(time / n);
}
Во втором примере, если размер списка слишком мал, мы можем точно получить представление осколько времени это займет, просто запустив это для достаточно большой n
.Однако у каждого есть свои преимущества и недостатки.
Однако, прежде чем делать что-либо из этого, я бы сделал расчет «разминки» перед раздачей:
// Or something smaller, just enough to let the compiler JIT
double dummy = 0;
for (int i = 0; i < 10000; i++)
dummy += Mean(data);
Console.WriteLine(dummy);
// Now do the actual timing
Альтернативный метод обоих заключается всделайте то, что сделал @Rig в своем ответе, и составьте список результатов для статистики.В первом случае вы просто составляете список для каждого отдельного времени.Во втором случае вы должны составить список среднего времени нескольких запусков, так как время для расчета может быть меньше, чем самое точное время в вашем секундомере.
Со всем этим сказано, я бы сказал, тамэто одно очень большое предостережение во всем этом: Очень трудно правильно рассчитать время, необходимое для запуска чего-либо.Замечательно хотеть делать профилирование, но вы должны сделать некоторое исследование SO и посмотреть, что другие люди сделали, чтобы сделать это правильно.Очень легко написать процедуру, которая иногда что-то плохо, но очень трудно сделать это правильно.