Erläuterung zu einem hochauflösenden Leistungsindikator und dessen Existenz in Bezug auf .NET Stoppuhr?

9

Innerhalb des statischen Stopwatch -Konstruktors können wir den folgenden Code sehen, der grundlegend prüft, ob ein hochauflösender Leistungsindikator existiert.

%Vor%

In MSDN heißt es über QueryPerformanceFrequency :

  

Ruft die Häufigkeit des hoch aufgelösten Leistungszählers ab, falls einer vorhanden ist

Es ist jedoch ziemlich unklar, wann genau es existiert? Ich vermute, dass es normalerweise auf aktuellen Maschinen existiert, aber wann genau nicht?

Es ist interessant, denn wenn es nicht existiert, wird Stopwatch zu einem bloßen Wrapper um die Eigenschaft DateTime.UtcNow .

    
Valentin Kuzub 08.08.2011, 18:23
quelle

2 Antworten

4

Es gibt einen Unterschied zwischen einem Timer und einer Stoppuhr, und die beiden führen zu falschen Annahmen. Leider wird der Begriff Timer zu oft verwendet, um mehrere Dinge zu bedeuten.

Jeder Computer, auf dem Windows 2000 oder höher ausgeführt wird, verfügt wahrscheinlich über einen Hochfrequenztimer. Ich bin nie auf einen Computer gestoßen, der später Windows 2000 ausführt, der so etwas nicht hat.

Nun, das ist der Hochfrequenz-Timer. Es gibt auch Timer: Windows oder .NET-Komponenten. Diese Timer werden nicht zum Halten der Zeit oder zum Messen der Zeit verwendet, sondern zum Ausführen von Aktionen in periodischen Intervallen. Die Windows-Zeitgeberobjekte können eine Auflösung von 1 ms aufweisen und sind sehr zuverlässig, wenn der Computer nicht an rechenintensiven Operationen beteiligt ist. Die .NET-Timer-Objekte sind auf eine Auflösung von ca. 15 ms begrenzt. Sie können das umgehen, indem Sie P / Invoke verwenden, um direkt mit den Windows-Objekten zu interagieren, aber das ist nicht oft notwendig.

Die .NET Stoppuhr-Klasse basiert auf dem Hochfrequenz-Timer. Im Allgemeinen fragt Start den Leistungsindikator ab und speichert den Wert. Wenn Sie Stop angeben, wird der Leistungsindikator erneut abgefragt. Die verstrichene Zeit ist eine einfache Subtraktion dieser beiden Werte. Sie können mit der Stoppuhr besser als die Auflösung in Mikrosekunde werden.

Und tatsächlich können Sie ein Stopwatch mit einer busy-waiting-Schleife erstellen, die Ihnen eine Auflösung unter einer Millisekunde bietet. Ich bezweifle, dass Sie damit eine Auflösung im Sub-Mikrosekunden-Bereich erreichen könnten.

Es ist wichtig zu verstehen, dass, obwohl Timer über 1 Millisekunde hinaus nicht zuverlässig sind, die Stoppuhr, die die verstrichene Zeit misst, viel genauer ist. Sie können wahrscheinlich Messungen der abgelaufenen Zeit im Mikrosekundenbereich von der Stoppuhr aus vertrauen. Darüber hinaus würde ich mich nicht darauf verlassen.

    
Jim Mischel 22.03.2013 20:54
quelle
1

Die tatsächliche Auflösung der Systemzeit liegt in der Größenordnung von Millisekunden (obwohl es angeblich 1/10 einer Millisekunde ist, habe ich noch nie eine Workstation gesehen, die diese Auflösung zuverlässig liefert).

Sie können jedoch zusätzliche Hardware (z. B. Zeitcodeleser) verwenden, die Auflösungen von bis zu Nanosekunden bietet. Diese werden normalerweise in industriellen Steuerungssystemen in Verbindung mit IPCs (Industrie-PCs) verwendet, um DAQ-Hardware zu synchronisieren. Sie können ein Beispiel mit einer Auflösung von 100 ns in PCI Express-Steckplatzkarten sehen. Zeitcode-Prozessor für PCI-Express-Low-Profile-x1-Lokalbus .

Gewöhnliche Workstations verwenden fast immer hochauflösende Zähler, aber die tatsächliche Auflösung ist nicht die, die Sie ohne zusätzliche Hardware erwarten würden (Mikro- oder Nanosekunden).

    
Teoman Soygul 08.08.2011 19:56
quelle