Es könnte ein Duplikat sein, aber ich wusste nicht, wie ich mein Problem erklären sollte.C# Stoppuhr - Inkonsistente Werte zurückgeben
Ich habe die Leistung Timing des Floyd Rivest Algorithmus Ich implementiert (in verschiedenen Fällen) mit der .NET Stoppuhr.
Um das Problem besser zu verstehen, hier ist der Code.
Ich Ausführung der 3 folgenden Verfahren nacheinander:
analysis.FRStopwatch (analysis.getOrderedArray()); analysis.FRStopwatch (analyse.getDescendingOrderedArray()); analysis.FRStopwatch (analysis.getUnorderedArray());
Verfahren FRStopwatch (int []) führt Folgendes aus:
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;
}
Der Ausgang I erhalten, die folgt: Original Output
Wie man sehen kann, werden die Timing-Weg des geordneten Anordnung ist größer als die anderen.
Dann kommentierte I out der ersten Zeile gezeigt:
analysis.FRStopwatch (analysis.getOrderedArray());
und ausgeführt nur die verbleibenden zwei in der folgenden Reihenfolge:
analysis.FRStopwatch (analysis.getDescendingOrderedArray()); analysis.FRStopwatch (analysis.getUnorderedArray());
Ich habe die folgende Ausgabe: (oder die anderen beiden arbeiten nicht richtig) New Output Es scheint, wie die erste Methode, die die Stoppuhr verwendet funktioniert nicht richtig. Wie behebe ich, dass die Ergebnisse konsistent sind? Hat das Problem mit meinem Computer zu tun (CPU-Ticks usw.)?
Wenn 'frs.Select (k [i]);' dauert weniger als ein paar Millisekunden, wird dies eine wirklich schreckliche Art sein, es zu Zeit. –
@Kim Wenige Schlüsselwörter: Cache, JIT und möglicherweise Objektstatus. Weit gefehlt, um vollständig und perfekt zu sein (Sie müssen es immer noch cum grano salis verwenden, Eric Lippert hat einen netten Einstiegsbeitrag zum Thema Benchmarking geschrieben), aber Sie sollten versuchen, dieses [microbenchmark Dienstprogramm] (https: // github. com/arepti/NetMicroBenchmark) (Disclaimer: Ich habe es geschrieben) –
Die anfängliche Verzögerung könnte auf JIT zurückzuführen sein - versuche, das Ganze zweimal in einer Schleife zu synchronisieren. –