Seltsame Benchmark-Ergebnisse

Mit einem alten Benchmarkprogramm bekomme ich unabhänig von der Hardwareleistung unerwartete Ergebnisse. Woran liegt das?

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 3 Min.

Ich verwende schon seit Ewigkeiten ein kleines Benchmark-Programm aus der Beispielsammlung von GFA-Basic namens FarnBenchmark. Dieses habe ich leicht abgewandelt für ein Fenster (1000 × 800 Punkte) kompiliert. Ich habe es nur schwer akzeptieren können, dass sich die Ergebnisse dieses kleinen, aber schönen und superschellen Benchmarks mit der Einführung von Windows 7, 8 und 10 erheblich verschlechtert haben. Mein Benchmark liefert auf einem i7-8700 (mit iGPU 630) ein Ergebnis von 5,9 Sekunden, auf einem Ryzen 3950X (mit GTX 1660) 7,4 Sekunden, jedoch auf einem relativ billigen i3-10100 (mit iGPU 630) 3,6 Sekunden (alles unter Windows 10 mit aktuellen Updates). Warum läuft das Programm auf einer Intel-CPU der zehnten Generation plötzlich wieder schneller?

Da spielen viele Faktoren eine Rolle. Das Verhalten der neueren Windows-Versionen ist leicht erklärbar: Das Uralt-Programm verwendet eine alte Schnittstelle zur Grafikausgabe (GDI, Graphics Device Interface). Seit Windows 7 verwendet Microsoft stattdessen primär die GPU-beschleunigte Schnittstelle Direct2D, die hauptsächlich auf der Grafikkarte läuft und viel schneller ist. Die alte GDI-Schnittstelle ist aus Kompatibilitätsgründen weiter vorhanden, läuft aber fast nur noch auf dem Prozessor, was erheblich langsamer ist als früher. Die virtuelle Maschine übersetzt die internen GDI-Zugriffe dann in Direct2D des Wirtssystems, sodass darin das Programm schneller läuft.

Außerdem handelt es sich um sehr alten Programmcode aus Uralt-Compilern. Damit moderne CPUs ihre optimale Performance liefern können, muss der Code auch mit aktuellen Compilern übersetzt werden. Zudem nutzt die Software nur einen Kern, ein Großteil der Performance moderner CPUs liegt also brach.

Warum die Software auf der zehnten Generation der Core-i-Prozessoren schneller läuft, können wir nicht ohne Weiteres sagen. Die Architekturunterschiede zur achten und neunten Generation sind extrem gering. Eventuell ist es eine Nebenwirkung der Fixes für die Spectre/Meltdown-Lücken. Da wurden bei den Core i-10000 einige Änderungen in Hardware vorgenommen, sodass die Microcode-Anpassungen der älteren CPUs nicht mehr notwendig sind. Wenn Ihr Benchmark zufällig genau so einen Befehl intensiv benutzt, kann sich das im Ergebnis stark auswirken. Durch die Microcode-Anpassungen läuft der Code ja nicht einfach durch die CPU, sondern die Befehle werden jedes Mal in andere übersetzt, die nicht für die Angriffe anfällig sind. Das kostet dann vergleichsweise viel Zeit. Aber das ist nur eine Spekulation.

Ansonsten allgemein zum Benchmarking: Wir verwenden sehr wenig synthetische Software wie diesen Benchmark, sondern wenn möglich reale Anwendungsprogramme beziehungsweise Benchmarks, die von solchen abgeleitet sind. Wir messen, wie lange es braucht, ein Video zu kodieren, wie schnell Dateien gepackt werden und so weiter. Das ist erheblich praxisnäher, zumal die Programme ja permanent aktualisiert werden und neue Compiler verwenden.

(chh)