// HEISE ONLINE — HARDWARE & GADGET
Welcher Befehl ist schneller? Hyperfine misst nach
Das Benchmark-Tool Hyperfine misst in Version 2.0.0 mehr als Laufzeiten. Zugleich ändern sich der Start von Testbefehlen und der JSON-Export.
Hyperfine 2.0.0 erweitert Benchmarks um zusätzliche Leistungswerte. Standardmäßig zeigt das Werkzeug neben der verstrichenen Zeit jetzt auch den höchsten Speicherbedarf eines Testlaufs an. Außerdem lassen sich weitere Messgrößen, etwa CPU-Zyklen und Cache-Fehlzugriffe, auswählen. Für bestehende Aufrufe sind vor allem zwei Änderungen wichtig: Hyperfine startet Testbefehle nun ohne vorgeschaltete Shell und gibt JSON-Ergebnisse in einem neuen Format aus.
Das Kommandozeilenwerkzeug führt Programme und Befehle wiederholt aus, wertet die Messungen statistisch aus und vergleicht auf Wunsch mehrere Varianten. Es richtet sich damit etwa an Entwickler, die Änderungen an einem Programm oder Skript auf ihre Leistung prüfen wollen. Laut dem Projekt-Repository auf GitHub kann Hyperfine Befehle vor der eigentlichen Messung ausführen und Benchmarks mit unterschiedlichen Parametern durchführen, beispielsweise mit verschiedenen Thread-Zahlen.
Über die neue Option --metrics können Nutzer festlegen, welche Werte Hyperfine erfasst und anzeigt. Die Release Notes zur Version 2.0.0 nennen neben Laufzeit und maximalem Speicherbedarf unter anderem ausgeführte Instruktionen, CPU-Zyklen, Cache-Fehlzugriffe und fehlgeschlagene Sprungvorhersagen. So lässt sich etwa erkennen, ob eine schnellere Programmvariante dafür mehr Speicher benötigt. Werte wie CPU-Zyklen und Cache-Fehlzugriffe kann Hyperfine nur ausgeben, wenn der Prozessor und das Betriebssystem die entsprechenden Messungen bereitstellen.
Die Terminalausgabe fasst die ausgewählten Messgrößen zusammen. Auch die Plot- und Analyseskripte des Projekts können mit den zusätzlichen Werten arbeiten. Einheiten werden ebenfalls über --metrics festgelegt, beispielsweise mit time_wall_clock:ms,memory_peak_resident:MiB. Die bisherige Option --time-unit entfällt.
Hyperfine startet die zu messenden Befehle standardmäßig ohne vorgeschaltete Shell. Wer darin Pipes oder Umleitungen verwendet, muss mit -S das bisherige Verhalten wiederherstellen oder mit --shell eine Shell auswählen. Befehle für --setup, --prepare, --conclude und --cleanup führt Hyperfine weiterhin in einer Shell aus.
Mit der neuen Option --env lassen sich Umgebungsvariablen für einen Testbefehl setzen, ohne dafür eine Shell einzuschalten. Bei einem parametrisierten Benchmark lässt sich mit --env 'OMP_NUM_THREADS={threads}' für jede Variante eine andere Thread-Zahl setzen.
Der JSON-Export verwendet nun Schemaversion 2. Er enthält Metadaten, Einzelmessungen und statistische Zusammenfassungen für die erfassten Größen. Wer solche Dateien automatisiert einliest, muss den Code anpassen: Der Laufzeitmittelwert steht nicht mehr unter results[i].mean, sondern unter results[i].summary.time_wall_clock.mean.
Auch die übrigen Exportformate ändern sich. CSV enthält die ausgewählten Messgrößen nebeneinander; Markdown, AsciiDoc und Org-Mode beschränken sich auf die zuerst ausgewählte Messgröße. Die Optionen --sort, --reference und --reference-name entfallen. Als Referenz für Vergleiche dient künftig stets der erste angegebene Befehl.
Alle Themen der kommenden iX im Überblick. Erscheint monatlich.