可能有重复,但我不知道如何解释我的问题。
我正在运行使用.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滴答等)吗?
答案 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以获得平均执行时间。这种方法将帮助您保持理智并更好地指示性能。