"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

TimerBench: Ein Benchmark für Windows Timer

mat 02.10.2017 302432 115
timerbench_225281.jpg
Präzise, verlässliche und performante Timer sind die Grundlage für einen reibungslosen Betrieb von Windows, insbesondere PC-Spielen, Benchmarks und Multimedia-Anwendungen. Trotzdem wird das Thema selbst von Enthusiasten kaum gewürdigt. Jeder kann heutzutage seine PC-Komponenten übertakten, um das letzte Tröpfchen an Performance aus seinem System herauszuquetschen. Welche Rolle dabei Timer für die Leistung spielen - und das nicht nur in Sachen Zeitmessung - ist vielen Anwendern unbekannt. Dieses Tool soll einige Fragen zu diesem Thema beantworten und euch dabei helfen, die optimale Konfiguration für Windows Timer für euer System zu finden.

English Version

Download: TimerBench 1.5 (173 MB, Self-extracting Exe, CRC32: 34EC2A27)
Prerequisites: DirectX 11

Der Fokus von TimerBench liegt derzeit hauptsächlich auf dem magischen Blackbox-Timer QueryPerformanceCounter, kurz QPC. Nicht grundlos, weil diese Windows API-Funktion wird derzeit in so gut wie jeder Anwendung für die Messung von Zeitdifferenz verwendet. Wer in einem Spiel eine Framerate-Anzeige oder eine Stopuhr sieht, kann höchstwahrscheinlich QueryPerformanceCounter bei der Arbeit beobachten. Das sind allerdings nur die augenscheinlichsten Anwendungszwecke, denn QPC kümmert sich meist um alles, was relativ in einer gewissen Zeit am Bildschirm abläuft. Das sind auch Animationen, das Physik-System, aber auch Funktionen innerhalb der Grafik-APIs wie DirectX. Wie oft QPC pro Sekunde verwendet wird, hängt von der Anwendung selbst und obendrein von der Framerate ab. In unseren Messungen können selbst weniger komplexe 3D-Workloads bei über 100 FPS problemlos hundertausende QPC-Aufrufe pro Sekunde absetzen. Wenn dabei der Aufruf des Timers zu langsam ist, kann die CPU die Grafikkarte(n) nicht ausreichend versorgen und die Framerate wird unnötig limitiert. Als Bottleneck ist dabei von außen nur die CPU ersichtlich, die sich mit einer Auslastung von 100% auf den beanspruchten Cores bemerkbar macht. Schuld daran kann aber auch die Performance des verwendeten Timers sein.

Genau diese Leistungseinbußen kann TimerBench für euch ausfindig machen. Unser Tool zeigt euch die aktuelle Konfiguration für QueryPerformanceCounter (QPC Mode) und erklärt den technischen Hintergrund zum verwendeten Timer (mit dem Button "What?"). Zusätzlich könnt ihr den QPC-Modus per Klick inklusive Neustart ändern und anschließend testen ("Run"). Der Benchmark selbst besteht aus zwei Tests, einem synthetischen für die maximale Rohleistung des Timers und einem Game Test für die Messung in Spielen. Der Game Test setzt auf die Unreal Engine (4.17.1) und DirectX.


Was ist HPET?



Wie euch bereits schon aufgefallen sein wird, kommt im Benchmark gerne das Wort "HPET" vor. Es steht für High Precision Event Timer und ist mit Abstand der präziseste Timer in PC-Systemen. Er ist im Chipsatz zuhause und läuft mit einer Frequenz von 14,32 MHz; bei modernen Intel-Plattformen (ab Skylake) sind es sogar 24 MHz. HPET hat leider ein Problem: So präzise seine Messung ist, so kostspielig kann auch ihr Abruf sein. Wie kostspielig? Bei älteren Plattformen wie Broadwell-E dauert das Anfordern eines HPET-Timestamps ungefähr 1 Mikrosekunde mit Windows 10. Der in der CPU integrierte TSC-Timer (Timestamp Counter) ist hingegen bis zu 100x schneller, dafür mindestens 4x weniger präzise - und leider abhängig von der Windows-Version und der Plattform teilweise unzuverlässlich für die Nutzung in Benchmarks, aber das ist eine andere Geschichte.

Im Normalfall stört weder die fehlende Präzision des TSC, noch die Mikrosekunde des HPET-Aufrufs, sodass die Einbußen in jeder Form in der Nähe der Messgenauigkeit liegen. Dadurch war es bis dato im Prinzip egal, ob Windows voll und ganz auf HPET oder auf TSC gesetzt hat. Je nach Spiel und Framerate waren vielleicht einige Animationen mit aktivem HPET eine homöopathische Menge flüssiger, während bei zu häufiger Timer-Nutzung und gleichzeitig schwachbrüstiger CPU der TSC zu ein paar Frames mehr verholfen hat. Genau diese Umstände haben so manche Forendiskussion im Internet verursacht, ob HPET nun besser deaktiviert werden soll oder nicht. Wenig überraschend gibt es dafür keine pauschal richtige Antwort.

Der X299 HPET-Bug



Vorhang auf für die aktuellen Plattformen: Die Idee bzw. Notwendigkeit für diesen Benchmark entstand durch unseren Test von Intels Kaby Lake X und Skylake X, die beide den High-End-Chipsatz X299 verwenden. In gewissen Situationen kam es bei unserem Benchmark-Parcours zu starken Ungereimtheiten bei der Gaming-Performance. Eine tiefgehende Recherche des Problems brachte eine unzureichend ausgelastete Grafikkarte durch ein CPU-Bottleneck zum Vorschein, das selbst mit 4,5 und mehr GHz auf allen Kernen unverändert blieb. Erst als unser Augenmerk auf die Timer-Konfiguration von Windows fiel, bemerkten wir, dass ein aktiver High Precision Event Timer für die volle Auslastung der Cores verantwortlich war. In folgendem Video zeigen wir den Einfluss eines aktiven HPET-Timers auf The Witcher 3, Doom (2016), Project CARS und The Division. In der ersten Zeile des Overlays seht ihr die GPU-Temperatur, die Auslastung und die GPU-Taktrate, die letzten vier Zeilen zeigen die Taktraten und die Auslastung aller CPU-Kerne:

Intel X299 HPET-Bug: Der Einfluss des High Precision Event Timers auf die Framerate in Spielen


Wie im Video gut ersichtlich ist, wirkt sich der Bug unterschiedlich stark auf die Framerate aus. In Project CARS verlieren wir nur 15 Frames pro Sekunde, während wir in Doom unter Vulkan gleich um die 100 Frames einbüßen müssen, aber trotzdem flüssig bleiben. The Witcher 3 wird mit 30 FPS quasi unspielbar, dasselbe Schicksal ereilt The Division. Hier sehen wir sehr gut, dass der Einfluss von schlechter Timer-Performance auch vom Spiel und dessen Programmierung abhängt. Je öfter die Zeitmessung pro Sekunde stattfindet, desto größer können die Einbußen sein.

How To



Wir empfehlen folgenden Ablauf für das Testen eurer Systeme:

  1. Auswahl der Auflösung, in der ihr Spiele spielt. Solltet ihr in mehreren Auflösungen spielen, dann testet die niedrigste.
  2. Hintergrundprogramme wenn möglich schließen.
  3. Benchmark starten und ungestört durchlaufen lassen.
  4. Wechseln des QPC Modes von TSC auf HPET oder umgekehrt - je nachdem was gerade aktiv ist. Ein Neustart ist notwendig.
  5. Schritt 1-3 wiederholen und Ergebnisse vergleichen (Button => Open Result).

Ergebnisse



Wie sich die negative Timer-Performance nun im Benchmark zeigen lässt, wollen wir mit folgenden Beispielen klären:


Fazit: Ein Core i9-10980XE ist theoretisch 175x langsamer als der Invariant TSC. Das führt in einem Spiel unter FullHD zu Leistungseinbußen von bis über 360 Frames/Sekunde und kräftigem Ruckeln (73 ms maximale Framezeit) im Game Test. Gleichzeitig sinkt die GPU-Last von 96% auf durchschnittlich 44%, die Grafikkarte ist also nicht mehr ausgelastet.

Empfehlung: Der High Precision Event Timer sollte immer deaktiviert sein! Sollte ein Präzisions-Timer gebraucht werden, raten wir den Support von Intel mit den Ergebnissen im Gepäck zu kontaktieren. ;)

AMD Ryzen R7 1800X
System: GTX 1080, 16 GB RAM, Windows 10 (64 bit)

1920x1080



2560x1440



3840x2160



Fazit: Der HPET-Timer von Ryzen ist ungefähr über 200x langsamer als der Invariant TSC. Das führt bei FullHD zu Leistungseinbußen von bis zu 26 Frames/Sekunde im Game Test, es entsteht dadurch allerdings kein zusätzliches Ruckeln. Bei höheren Auflösungen vermindern sich die Leistungseinbußen stark, sind aber doch noch ersichtlich. Bei UHD (3840x2160) verliert man durch den Timer nur noch 6 FPS.

Empfehlung: Der High Precision Event Timer kostet Leistung bei geringeren Auflösungen in Kombination mit stärkeren Grafikkarten. Wenn kein Präzisions-Timer für eine spezielle Anwendung/Benchmark von Nöten ist, sollte HPET besser deaktiviert bleiben.

Timer-Nutzung in anderen Prozessen



TimerBench misst nicht nur die Leistung des QPC-Timers, sondern lässt euch auch messen, welche Timer in anderen Prozessen bzw. Anwendungen zum Einsatz kommen. Über den Menüpunkt "Tools => Measure Process" erreicht ihr ein Dialogfeld, das nur mit einem Prozessnamen gefüttert werden muss, um eine laufende Anwendung abhören zu können. Der Prozessname ist meist der Name der ausgeführten .exe-Datei. Ihr findet eine Liste aller Prozesse im Task Manager, Tab "Details". Unterstützt werden alle gängigen API-Timer von Windows, jede Verwendung wird euch angezeigt inklusive durchschnittliche Aufrufe pro Sekunde. Folgende Abkürzungen helfen euch bei der Identifikation:


Um die Funktion etwas besser zu veranschaulichen, hier die Messung der verwendeten Timer in SuperPi. Zu Beginn der Kalkulation von Pi sowie jeweils pro Loop wird ein Mal GetTickCount() und ein Mal GetLocalTime() aufgerufen:

timerbench-measure-timer-usage-in-other-processes_226032.png
Messung der Timer-Nutzung in SuperPi


FAQ



Was sind die Mindestvoraussetzungen?

TimerBench ist mit allen Plattformen kompatibel, unterstützt allerdings nur Windows 7 und höher.

Warum meldet TimerBench, dass die Datei MSVCP140.dll fehlt?

Verwendet bitte die neueste Version von TimerBench, sie hat die Visual C++ Runtime statisch gelinkt, damit dieser Fehler nicht mehr auftritt.

Warum unterscheiden sich die Benchmark-Werte bei mir von Run zu Run?

Wie bei jedem anderen Benchmark solltet ihr darauf achten, dass möglichst wenige Hintergrundprogramme laufen. Bei aktivem High Precision Event Timer kann es speziell beim theoretischen Test trotzdem zu größeren Schwankungen kommen, weil er nur eine bestimmte Anzahl pro Sekunde ausgelesen werden kann, unabhängig von der Taktrate der CPU und der verfügbaren Cores. Da das Betriebssystem für viele grundlegende Funktionen ebenfalls auf HPET zurückgreift, nimmt er dem Benchmark quasi Timer-Ressourcen weg. Ein guter Weg um das zu bestätigen, ist das gleichzeitige Aufrufen von zwei oder mehr theoretischen Tests über mehrere Instanzen des Benchmarks.

Archiv



Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz