2013-03-04 5 views
3

поэтому у меня есть все алгоритмы поиска, и я отправляю случайные 20000 номеров в каждый алгоритм, пытаясь выяснить, сколько времени займет каждый..NET Секундомер класса, ведет себя странно

 public void functionsForSorts(int[] array) 
    { 
     Stopwatch sw = new Stopwatch(); 
     long elapsedTime = sw.ElapsedTicks; 

     if (array.Length == 20000) 
     { 
      sw.Start(); 
      BubbleSort.Bubble(array); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label1.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 

      sw.Restart(); 
      SelectionSort.Selection(array); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label2.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 

      sw.Restart(); 
      InsertionSort.Insertion(array); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label3.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 

      sw.Restart(); 
      MergeSort.mergeSort(array, 0, array.Length - 1); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label4.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 

      sw.Restart(); 
      ShellSort.Shell(array); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label5.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 

      sw.Restart(); 
      QuickSort.Quicksort(array, 0, array.Length - 1); 
      sw.Stop(); 
      elapsedTime = sw.ElapsedMilliseconds; 
      label6.Text += "\t" + elapsedTime.ToString() + " miliseconds "; 
      Application.DoEvents(); 
     } 

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

Еще одна неудобная часть об этом, когда я комментирую пузырь и сортировку сортировки, Вставка даст правильные результаты, это верно для всех алгоритмов, если я сделаю их 1-й по порядку, im получаю надлежащие результаты, я показал это моим друзьям, они не имеют никакого понятия, либо, это действительно не имеет смысла вообще ...

+1

Можете ли вы показать нам весь код? –

+0

Можете ли вы попробовать тест с какой-либо другой случайной операцией, такой как 'label1.Tag = sw.ElapsedMillilseconds.ToString()' вместо 'i5k.Insertion (array)' просто чтобы увидеть, имеет ли операция сортировки какое-либо отношение к ней - - чтобы убедиться, что вы получаете 0 на * любой * операции, выполненной в этой позиции? – BlueMonkMN

+0

На самом деле, если вы просматриваете миллисекунды вместо тиков, вам придется использовать более длительную операцию, например 'System.Threading.Thread.sleep (1000)'. – BlueMonkMN

ответ

4

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

(Edit - Я, очевидно, имеют очень трудное время набрав слово «возможный» вместо «возможно» ... исправлена.)

+0

Хороший улов; для меня 40k int sort занимает 3 мс из скремблированных данных, но из этого теперь отсортированного состояния: 0ms время гнезда –

+0

@MarcGravell Вы копируете код сортировки вставки из случайных онлайн-ресурсов, или у вас уже есть, или вы используете встроенный .NET quicksort (который на самом деле идет медленнее на отсортированных данных, так что я сомневаюсь), или вы только вручную внедрили свою собственную сортировку вставки? – BlueMonkMN

+0

для быстрого теста, я просто использую 'Array.Sort' - не то же самое, но только после теоретических ограничений здесь –

4

, что невозможно

что заставляет вас сделать вывод, что это не так возможное? имейте в виду, что даже Stopwatch имеет ограниченную точность. 0 не означает, что на это ушло совсем немного времени; это может означать: «для регистрации с достаточной точностью не хватило времени». Чтобы получить разумное время на то, что быстро, вам часто приходится выполнять его несколько раз (что означает: тысячи или даже миллионы раз) в цикле внутри временной области. Не видя того, что делает Insertion, мы все знаем, что это прекрасно.

Лично я хотел бы использовать:

sw = Stopwatch.StartNew(); 
// probably loop here!! 
i5k.Insertion(array); 
sw.Stop(); 
+0

, читайте внимательно, он дает правильный результат, когда я запускаю только код сортировки вставки, он испортится, когда я запускаю весь код, я не просто отправляю 5000 номеров, im отправляет 10000, 20000 и 40000 тоже, возможно ли сортировка вставки сортировать все эти цифры за 0 миллисекунд? – imdrunkisuppose

+1

@imdrunkisuppose, как я могу ответить, не видя ваш код вставки?Но да: компьютеры бывают быстрыми. Действительно быстро. –

+0

@imdrunkisuppose моя локальная машина может сортировать массив из 40k ints в 3ms. Если у вас есть мускулистый бокс, 0ms не является необоснованным. –

2
elapsedTime = sw.ElapsedMilliseconds; 

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

1

Не используйте Stopwatch.ElapsedMilliseconds, который вернет 0, если операция заняла менее 1 миллисекунды.

Использовать секундомер. Вместо этого. А также сделайте то, что сказал Марк.

 Смежные вопросы

  • Нет связанных вопросов^_^