Zunächst einmal müssen Sie erkennen, dass es ist extrem schwierig, wenn nicht unmöglich, genaues Timing auf einem Computer aufgrund von Einschränkungen sowohl durch die Hardware und Software ausgesetzt. Die gute Nachricht ist, dass diese Art von Präzision selten notwendig ist. Zehn Ticks ist eine wahnsinnig kleine Menge an Zeit. In diesem Intervall wird von der CPU sehr wenig Arbeit geleistet, und sie wird niemals statistisch signifikant sein.
Als Referenz hat die Windows-Uhr eine Genauigkeit von etwa 10 Millisekunden (weniger bei früheren Versionen). Das Einpacken Ihres Codes mit Anrufen an DateTime.UtcNow
wird nicht besser machen.
In Ihrer Frage sprechen Sie darüber, dass Sie "ein Ereignis auslösen" wollen. Das Problem besteht darin, dass der einzige Typ des Zeitmessobjekts, das ein Ereignis in bestimmten Intervallen auslöst, das Objekt Timer
ist. Es ist verfügbar in 3 verschiedenen Inkarnationen im .NET Framework (System.Timers.Timer
, System.Threading.Timer
und System.Windows.Forms.Timer
), die alle ihre eigenen einzigartigen Szenarien und relative Macken haben, aber keine von ihnen garantieren Genauigkeit überall in der Nähe, was Sie für fragen . Sie sind nicht einmal dafür ausgelegt, und es gibt auch keine entsprechenden Funktionen, die von der Windows-API bereitgestellt werden, die diese Art von Genauigkeit bieten.
Der Grund, warum ich gefragt habe, warum du das machen wolltest und ob du einen Benchmark suchst, liegt daran, dass sich das ganze Spiel verändert. Das .NET Framework (ab Version 2.0) bietet eine Stopwatch
object, die ausdrücklich dafür ausgelegt ist, die verstrichene Zeit für eine Situation wie Benchmarking oder Performance Profiling genau zu messen. Die Stopwatch
umschließt einfach die Windows-API-Funktionen QueryPerformanceFrequency
und QueryPerformanceCounter
(was meinen Vorschlag hinsichtlich seiner beabsichtigten Verwendung bestätigen sollte). Früher mussten wir diese Funktionen aufrufen, um auf diese Art von Funktionalität in früheren Versionen des Frameworks zugreifen zu können, aber jetzt ist es bequem eingebaut. Wenn Sie einen Timer mit einer relativ hohen Auflösung für das Benchmarking benötigen, ist die Stopwatch
Ihre beste Wahl . In der Theorie kann es Ihnen mit Sub-Mikrosekunden Timing zur Verfügung stellen.
Aber es ist nicht ohne seine Probleme. Es werden keine Ereignisse ausgelöst. Wenn Ihr aktuelles Design also auf der Ereignisbehandlung beruht, müssen Sie es neu überdenken. Und, ist es auch nicht garantiert, genau zu sein. Sicher, es kann die höchstmögliche Auflösung Hardware-Einschränkungen haben, aber das bedeutet nicht, dass es Ihre angegebenen Anforderungen erfüllen wird. Zum Beispiel kann es auf einem Mehrprozessorsystem unzuverlässig sein, wo Start
und Stop
auf demselben Prozessor ausgeführt werden müssen. Es sollte nichts ausmachen, aber it does. Es ist auch subject to being unreliable auf Prozessoren, die ihre Taktgeschwindigkeit auf und ab drosseln können. Und ich wage sogar zu erwähnen, dass der Anruf bei QueryPerformanceCounter
selbst einige Zeit in Anspruch nimmt - etwa 5 Mikrosekunden sogar auf einem modernen 2+ GHz-Prozessor, was verhindert, dass Sie das in der Theorie gut bekannte Zeitfenster von unter einer Mikrosekunde tatsächlich erreichen können. Andererseits würde jeder vernünftige Code-Profiler diese Menge an Zeit als vernachlässigbar betrachten, denn, nun, ist es.
(Siehe auch: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)
Warum in der Welt möchten Sie alle 11 Ticks ein Ereignis auslösen? Verwenden Sie dies für die Code-Profilerstellung? –
Sie beantworten keine Fragen. 11 Tick ist nur ein Beispiel. alles was ich will ist ein hochauflösender Timer. wenn möglich, bis zu 1 Tick. und ja, ich entwickle eine Anwendung, um eine Benchmark zu machen. –
Deshalb unterstütze ich Downvoting-Kommentare –