Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 秒表给出随机结果_C#_Stopwatch - Fatal编程技术网

C# 秒表给出随机结果

C# 秒表给出随机结果,c#,stopwatch,C#,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;

这是我第一次尝试使用秒表来测量代码性能,我不知道哪里出了问题。我想检查在使用整数计算平均值时,转换为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;
    }
使用秒表测试这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");
Stopwatch sw=新秒表();
sw.Start();
对于(int i=0;i<1000000;i++)
{
var-ret=平均值(2,3);
}
sw.Stop();
Console.Write(“使用0.0:+sw.ElapsedTicks+”\n”);
sw.Reset();
sw.Start();
对于(int i=0;i<1000000;i++)
{
var ret2=AvarageDouble(2,3);
}
sw.Stop();
Console.Write(“使用双精度(s+d):“+sw.ElapsedTicks+”\n”);
sw.Reset();
sw.Start();
对于(int i=0;i<1000000;i++)
{
var ret3=AvarageDouble2(2,3);
}
sw.Stop();
Console.Write(“使用双(x):”+sw.ElapsedTicks+“\n”);
它显示随机结果,一次平均值为fastets,另一次为AverageDouble或AverageDouble2。我使用diff变量名,但看起来这并不重要

我错过了什么


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

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

在运行时如此之小的方法中,这一点更值得注意。在这些噪音的地方,运行时间可以增加一倍以上


下面是一个详细而更好的解释。

你所说的随机结果是什么意思?这与Methe的预期一样。没有区别,所有三个版本都要求处理器执行完全相同的机器代码指令。您看到的是,处理器并不是确定性地执行代码。在多任务操作系统上运行它是其中非常重要的一部分,您的程序不是唯一运行的代码。。但是它的性能和处理器本身一样低,例如,它受到代码在内存中的确切位置和缓存状态的影响。