具有两个watch实例时,StopWatch返回0ms

时间:2019-07-11 20:51:27

标签: c#

我正在尝试测量两个功能的运行时间,我在两个功能中都设置了计时器。但是,如果我连续第二次运行这些返回0ms,那为什么呢?

    using System;
    using System.Collections.Generic;

    namespace TestParallelLoops
    {
    class Program
    {
        static void Main(string[] args)
        {

            first();
            second();
        }

        static void first()
        {
            var watch = new System.Diagnostics.Stopwatch();
            watch.Start();

            Console.WriteLine(fibonacci(50));

            watch.Stop();

            Console.WriteLine($"Execution Time: {watch.ElapsedMilliseconds} ms");
        }

        static void second()
        {
            var watch1 = new System.Diagnostics.Stopwatch();

            watch1.Start();

            Console.WriteLine(fibonacciRecursive(50));

            watch1.Stop();

            Console.WriteLine($"Execution Time: {watch1.ElapsedMilliseconds} ms");
        }

        static long fibonacci(int n)
        {
            Dictionary<int, long> last = new Dictionary<int, long>();

            last[0] = 0;
            last[1] = 1;
            int next = 2;

            while (next<=n)
            {
                last[next] = last[next-1] + last[next-2];
                next++;
            }

            return last[n];
        }

        static long fibonacciRecursive (int n)
        {
            if (n == 0) return 1;
            if (n == 1) return 1;

            return fibonacciRecursive(n - 1) + fibonacci(n - 2);
        }


    }
}

如果我只执行第一次,我会看到〜100毫秒,如果我只执行第二次,我会看到〜100毫秒,但是如果我同时执行,我会看到〜100毫秒和0毫秒。

非常感谢

2 个答案:

答案 0 :(得分:3)

Dustin S.可能会赚钱,第一个Console.WriteLine会导致最初的100ms命中。将main更改为

static void Main(string[] args)
{
    Console.WriteLine("Here we go!");
    first();
    second();
}

给定机器运行的速度以及秒表的基本精度,两者的结果都为0 ms。

您的fibanacciResursive调用不是完全递归的,它应该具有以下return

return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);

花了〜2s(我将值降低到45)的时间比我想等待在我的计算机上评估值为50的时间长,因为这不会缓存中介结果并付出很多努力。

您执行的撤消实现的确存在另一个与警卫有关的问题,该问题导致它实际上返回第n + 1个斐波那契数,但我将其保留为练习。

在任何情况下,考虑到fibonaccifibonacciRecursive的当前实现(没有上述修复),对于大多数机器而言,两者的结果均为0ms,而其值只有50个声音。< / p>

答案 1 :(得分:2)

我认为您100毫秒可能是解锁控制台所需的时间。保存该值,并在定时块之外编写控制台,如下所示(对first()方法执行相同操作):

    static void second()
    {
        var watch1 = new System.Diagnostics.Stopwatch();
        watch1.Start();
        var a = fibonacciRecursive(50);
        watch1.Stop();
        Console.WriteLine(a);
        Console.WriteLine($"Execution Time: {watch1.ElapsedMilliseconds} ms");
    }