Ich möchte die Geschwindigkeit eines Algorithmus testen, was DateTime
Überlastung die genaueste Zeitangabe? (Ich brauche immer noch Tag/Monat/Jahr/Sekunden, aber dann möchte ich auch Millisekunden).
Antworten
Zu viele Anzeigen?Versuchen Sie, dies mit System.Diagnostics.Stopwatch zu tun:
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
Andere haben erwähnt Stopwatch
was in der Tat eine gute Idee ist. Ich habe jedoch einen anderen Ansatz: Ich versuche, den Algorithmus so lange zu messen, dass die normale Zeitauflösung des Systems ausreicht. (Im Allgemeinen bin ich noch verwenden. Stopwatch
da es der richtige Typ für die Aufgabe ist, aber das ist egal). Zum Beispiel, in meinem letzten IO-Prüfung Ich mache mir nur die Mühe, Sekunden zu melden, weil meine Tests Minuten (manchmal eine halbe Stunde) brauchen, um zu laufen. Zu diesem Zeitpunkt sind Millisekunden unangebracht, da sie im Rauschen anderer Prozesse untergehen würden usw.
Es ist natürlich nicht immer möglich, Tests so lange laufen zu lassen, aber wo es möglich ist, ist es eine gute Sache. Bei kürzeren Tests wäre ich vorsichtig mit Benchmarks, die weniger als 5 Sekunden dauern... eine kurze Aktivität eines anderen Prozesses kann einen unverhältnismäßig großen Effekt haben.
Eine weitere Überlegung: Messen Sie die CPU-Zeit anstelle der Wandzeit:
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetProcessTimes(IntPtr hProcess,
out FILETIME lpCreationTime,
out FILETIME lpExitTime,
out ulong lpKernelTime,
out ulong lpUserTime);
static ulong GetTime(Process process)
{
FILETIME lpCreationTime, lpExitTime;
ulong lpKernelTime, lpUserTime;
GetProcessTimes(process.Handle, out lpCreationTime,
out lpExitTime, out lpKernelTime, out lpUserTime);
return lpKernelTime + lpUserTime;
}
Wenn man zwei subtrahiert DateTime
Strukturen, erhalten Sie eine TimeSpan
Struktur. Verwendung von TimeSpan
können Sie den Abstand zwischen den beiden Zeiten ermitteln.
var before = DateTime.Now;
System.Threading.Thread.Sleep(6500);
var after = DateTime.Now;
var timeTaken = after - before;
var secondsTaken = timeTaken.TotalSeconds;
var milisecondsTaken = timeTaken.TotalMiliseconds;
Beachten Sie, dass Sie Folgendes verwenden müssen TotalXXXX
um die gesamte XXXX
Andernfalls wird es eher dem entsprechen, was ein Mensch wollen würde. In diesem Fall timeTaken.Seconds = 5
mais timeTaken.TotalSeconds = 65
.
Es folgt ein Codebeispiel für die Verwendung der Klasse System.Diagnostics.Stopwatch:
Stopwatch sw = Stopwatch.StartNew();
// Put the code here that you want to time
sw.Stop();
long elapsedTime = sw.ElapsedMilliseconds;
DateTime.Ticks ist nur bis auf etwa 15 ms genau und eignet sich daher nicht für die Zeitmessung kurzer Algorithmen.