2016-10-21 6 views
-1

Так что в основном то, что я пытаюсь сделать, это рассчитать среднее значение всех периодов остановки, которые производит мой цикл for и выводит его на консоль. Я знаю, как взять средний, но я не знаю, как применить его к секундомеру раз. Пожалуйста помоги?Как рассчитать среднее значение нескольких периодов секундомера?

for (int index = 0; index < iterations; index++) 
     { 
      // loop to generate an array of random numbers  
      for (int count = 0; count < arrayOfInts.Length; count++) 
      { 
       arrayOfInts[count] = r.Next(numitems); 
      } 
      // a random array has been created start the clock and sort it 
      Stopwatch elpased = new Stopwatch(); 
      elpased.Start(); 
      selectionSort(arrayOfInts); 
      elpased.Stop(); 

      if (iterations == iterations) 
      { 

       var average = elpased.Elapsed; 

       Console.WriteLine ("Time for ___ sort to complete: " + elpased.Elapsed.ToString()); 
      } 
      } 



      Console.ReadLine(); 
    } 

Это то, что у меня есть.

+2

Когда будут выполняться 'итерации == итерации' когда-либо ложные? – zzzzBov

+0

Возможный дубликат [Найти среднюю сумму временных интервалов] (http://stackoverflow.com/questions/8847679/find-a-s-software-of-collection-of-timespans) –

+0

Вы сказали, что знаете, как взять среднее, на самом деле не брать среднее. – Brandon

ответ

3

Вместо этого я предлагаю использовать ElapsedTicks. И вам нужно хранить тики для каждой итерации и вычислить среднюю впоследствии:

List<long> ticks = new List<long>(); 
for (int index = 0; index < iterations; index++) 
{ 
    // loop to generate an array of random numbers  
    for (int count = 0; count < arrayOfInts.Length; count++) 
    { 
     arrayOfInts[count] = r.Next(numitems); 
    } 

    // a random array has been created start the clock and sort it 
    Stopwatch elapsed = new Stopwatch(); 
    elapsed.Start(); 
    selectionSort(arrayOfInts); 
    elpased.Stop(); 
    ticks.Add(elapsed.ElapsedTicks); 
} 

double avg = ticks.Average(); // create average of ticks 
TimeSpan averageTimeSpan = new TimeSpan((long)avg); // cast needed from double to long 

Существует немного более элегантный способ произвести ваш массив случайных чисел:

arrayOfInts = Enumerable.Range(0, count).Select(i => r.Next(numitems)).ToArray(); 

И потому, что LINQ использует отложенное выполнение, вы даже можете предварительно объявить этот «запрос» и позвонить ToArray() на итерации:

List<long> ticks = new List<long>(); 
IEnumerable<int> randomQuery = Enumerable.Range(0, count).Select(i => r.Next(numitems)); 

for (int index = 0; index < iterations; index++) 
{ 
    //creates NEW random numbers each time, because of deferred execution 
    arrayOfInts = randomQuery.ToArray(); 

    ... 

Другое предложение, чтобы позволить Stopwatch измерить весь время и разделить результат на iterations. Stopwatch можно возобновить:

IEnumerable<int> randomQuery = Enumerable.Range(0, count).Select(i => r.Next(numitems)); 
Stopwatch elapsed = new Stopwatch(); // only ONE instance needed 
for (int index = 0; index < iterations; index++) 
{ 
    arrayOfInts = randomQuery.ToArray(); 
    elapsed.Start(); // resumes without a reset 
    selectionSort(arrayOfInts); 
    elpased.Stop(); 
} 
TimeSpan averageTimeSpan = new TimeSpan(elapsed.ElapsedTicks/iterations); 
+0

Большое спасибо, я внесла в него изменения, чтобы исправить мои потребности. –

+0

Я пытался сделать что-то подобное, но получал цифры, которые просто не имели смысла. Выключается 'Elapsed.Ticks' следует использовать вместо' ElapsedTicks' по причинам, описанным здесь [http://geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch- тики-это-не-TimeSpan-ticks.aspx). – Ocelot20