首页 文章

StopWatch提供随机结果

提问于
浏览
-1

这是我第一次尝试使用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为紧固,其他时间为AverageDouble或AverageDouble2 . 我使用diff变量名,但看起来没关系 .

我错过了什么?

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

1 回答

  • 2

    测试了你的代码,是的,结果有时非常随机 . 请记住 Stopwatch 只是从 sw.start()sw.stop() 的时间 . 它没有考虑.Net的Just In Time编译,操作系统进程调度,cpu负载等 .

    在具有如此小的运行时间的方法中,这将是更值得注意的 . 这些噪音,可以超过运行时的两倍 .

    在下面的SO问题Calculate the execution time of a method中写了详细而更好的解释 . 看看那里 .

相关问题