秒表给出随机结果

StopWatch gives random results

这是我第一次尝试使用 StopWatch 来衡量代码性能,我不知道哪里出了问题。我想检查转换为 double 以计算整数平均值时是否存在差异。

    public static double Avarage(int a, int b)
    {
        return (a + b + 0.0) / 2;
    }

    public static double AvarageDouble(int s, int d)
    {
        return (double)(s + d) / 2;
    }

    public static double AvarageDouble2(int x, int v)
    {
        return ((double)x + v) / 2;
    }

使用 StopWatch 测试这 3 种方法的代码:

        Stopwatch sw = new Stopwatch();

        sw.Start();
        for (int i = 0; i < 1000000; i++)
        {
            var ret = Avarage(2, 3);
        }
        sw.Stop();

        Console.Write("Using 0.0: " + sw.ElapsedTicks + "\n");
        sw.Reset();
        sw.Start();
        for (int i = 0; i < 1000000; i++)
        {
            var ret2 = AvarageDouble(2, 3);
        }
        sw.Stop();
        Console.Write("Using Double(s+d): " + sw.ElapsedTicks + "\n");
        sw.Reset();
        sw.Start();
        for (int i = 0; i < 1000000; i++)
        {
            var ret3 = AvarageDouble2(2, 3);
        }
        sw.Stop();
        Console.Write("Using double (x): " + sw.ElapsedTicks + "\n");

显示随机结果,一次Average是fastets,其他时候是AverageDouble或AverageDouble2。我使用 diff 变量名,但看起来没关系。

我错过了什么?

PS。使用两个整数作为输入计算平均值的最佳方法是什么?

测试了您的代码,是的,结果有时非常随机。请记住 Stopwatch 只是从 sw.start()sw.stop() 所经过的时间。它没有考虑 .Net 的即时编译、操作系统进程调度、cpu 加载等

这在具有如此小的运行时间的方法中会更加值得注意。这些噪音在哪里,可以使运行时间增加一倍。

下面SO question.

中写了一个详细和更好的解释