【发布时间】:2016-05-25 13:18:19
【问题描述】:
可能有重复,但我不知道如何解释我的问题。
我正在运行我使用 .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 滴答声等)?
【问题讨论】:
-
如果
frs.Select(k[i]);花费的时间少于几毫秒,这将是一种非常糟糕的计时方式。 -
@Kim 几个关键字:缓存、JIT 和可能的对象状态。远远不够完整和完美(你仍然需要使用它 cum grano salis,Eric Lippert 写了一篇关于基准测试的不错的入门级帖子)但你可能想试试这个microbenchmark utility(免责声明:我写的)
-
最初的延迟可能是由于 JIT - 尝试在一个循环中对整个事情进行两次计时。
-
JIT 是这里的问题。
标签: c# debugging time stopwatch diagnostics