.NET的秒表类,表现得很奇怪

时间:2013-03-04 14:01:07

标签: c# stopwatch insertion-sort

所以,我拥有所有搜索算法,并且我向每个算法发送随机的20000个数字,试图找出每个算法需要多长时间。

        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();
        }

问题是秒表不会给出正确的结果,它适用于冒泡排序,选择排序和合并排序,但我不知道为什么,它总是为insertionsort写0,即使它有适当的值而debugging.and它没有为shell排序和快速排序提供适当的值。

关于这一点的另一个尴尬的部分,当我评论出气泡和选择排序时,插入将给出正确的结果,对于所有算法都是如此,如果我按顺序将它们作为第一个,我得到了正确的结果,我展示了这个对我的朋友们来说,他们也没有任何线索,这根本没有意义......

4 个答案:

答案 0 :(得分:4)

  

这是不可能的

是什么让你得出结论认为这是不可能的?请记住,即使Stopwatch精度有限。 0并不意味着“它花了很长时间”;它可能意味着“没有足够的时间来注册可用的精度”。要在快速的事物上获得合理的计时,您通常需要在定时区域内的循环中多次执行(意味着:数千甚至数百万次)。没有看到Insertion的作用,我们知道这很好。

就个人而言,我会使用:

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

答案 1 :(得分:4)

如果数组已经排序,那么您的插入排序可能无关,并且在不到1毫秒内完成。如果您之前的排序使数组排序,那么这是可能的。

编辑 - 我显然很难输入“可能”这个词,而不是“可能”...更正。)

答案 2 :(得分:2)

 elapsedTime = sw.ElapsedMilliseconds;

毫秒是很长的一段时间,现代处理器可以在几毫秒内执行数百万条指令。足够让你的插入排序在不到一毫秒内完成,所以ElapsedMilliseconds返回0.避免丢弃你从秒表中获得的分辨率,改为使用它的Elapsed属性。

答案 3 :(得分:1)

不要使用Stopwatch.ElapsedMilliseconds,如果操作时间不到1毫秒,则返回0。

使用Stopwatch.ElapsedTicks代替。并且也做了Marc上面所说的。