C#秒表 - 返回不一致的值

时间:2016-05-25 13:18:19

标签: c# debugging time stopwatch diagnostics

可能有重复,但我不知道如何解释我的问题。

我正在运行使用.NET秒表实现的Floyd Rivest算法的性能计时(在不同的情况下)。

为了更好地理解这个问题,这里是代码。

我一个接一个地执行以下3个方法:

  

analysis.FRStopwatch(analysis.getOrderedArray());   analysis.FRStopwatch(analysis.getDescendingOrderedArray());   analysis.FRStopwatch(analysis.getUnorderedArray());

方法FRStopwatch(int [])执行以下操作:

public double FRStopwatch(int[] array)
{
    frs = new FloydRivestSelection(array);
    double avg = 0;
    Stopwatch s = new Stopwatch();
    for (int i = 0; i < k.Length; i++)
    {
        Thread.Sleep(10);
        s.Start();
        frs.Select(k[i]);
        s.Stop();
        avg = avg + (double)s.Elapsed.TotalMilliseconds;
        s.Reset();
        Console.WriteLine(avg);
    }
    avg = avg / (double)k.Length;
    return avg;
}

我得到的输出如下: Original Output

可以看出,有序数组的时序比其他数组大。

然后我注释掉了显示的第一行:

  

analysis.FRStopwatch(analysis.getOrderedArray());

并按以下顺序仅执行其余两项:

  

analysis.FRStopwatch(analysis.getDescendingOrderedArray());   analysis.FRStopwatch(analysis.getUnorderedArray());

我得到以下输出: New Output 似乎使用秒表的第一种方法工作不正确(或其他两种工作不正确?)。我如何修复是为了使结果一致?问题与我的电脑有关(CPU滴答等)吗?

3 个答案:

答案 0 :(得分:1)

这些行有问题:

avg = avg + (double)s.Elapsed.TotalMilliseconds;
Console.WriteLine(avg);

您正在增加平均值,但输出总和。试着这样做,输出&#34;当前&#34;平均。

avg = avg + (double)s.Elapsed.TotalMilliseconds;
Console.WriteLine(avg / (i+1));

或者,如果您对每次迭代的运行时感兴趣:

Console.WriteLine(s.Elapsed.TotalMilliseconds);
//reset after instead of before of course
s.Reset();

答案 1 :(得分:0)

您正在向控制台打印累计时间总和,而不是平均值或个别时间。

我建议您按照以下方式打印个人时间:

s.Start();
frs.Select(k[i]);
s.Stop();
var elapsed = (double)s.Elapsed.TotalMilliseconds;
avg = avg + elapsed; //it is really sum, not avg
s.Reset();
Console.WriteLine(elapsed);

我猜第一种方法的第一次迭代会消耗最多的时间,可能是因为JIT compilation。如果您单独打印,您会清楚地看到这一点。

另外,我建议您将变量名称从avg更改为sum,并仅计算循环后的平均值。

答案 2 :(得分:0)

小型请求的单个样本会受到太多变量的影响。

为了更好地指示性能,每次运行几千次(比如说6000),然后丢弃前1000个左右的结果以消除任何预热因素(JIT /缓存等)。

获取结果并除以5000以获得平均执行时间。这种方法将帮助您保持理智并更好地指示性能。