Wie messe ich den Takt meines Computers manuell?

Wie messe ich den Takt meines Computers manuell?

Mein PC hat zwei Prozessoren und ich weiß, dass jeder mit 1,86 GHz läuft.

Ich möchte den Takt meines/meiner PC-Prozessoren manuell messen. Meine Idee ist, einfach den Quotienten zwischen der Anzahl der Assemblerzeilen eines Programms und der Zeit zu berechnen, die mein Computer für die Ausführung benötigt. So habe ich die Anzahl der Assembleranweisungen pro Zeit, die von der CPU verarbeitet werden (das ist, was ich unter einem „Taktzyklus“ verstanden habe). Ich dachte, ich könnte das folgendermaßen machen:

  1. Ich schreibe ein C-Programm und konvertiere es in Assemblercode.
  2. Ich mache: $gcc -S my_program.c, was dem gcc-Compiler sagt, dass er den gesamten Kompilierungsprozess durchführen soll, mit Ausnahme des letzten Schritts: my_program.c in ein binäres Objekt umzuwandeln. Somit habe ich eine Datei namens my_program.s, die den Quellcode meines C-Programms enthält, übersetzt in Assemblercode.
  3. Ich zähle die Zeilen meines Programms (nennen wir diese Zahl N). Ich habe Folgendes gemacht:
    $ nl -l my_program.s | tail -n 1und habe das Folgende erhalten:

    1000015     .section    .note.GNU-stack,"",@progbits
    

    Das heißt, das Programm besteht aus einer Million Codezeilen.

  4. Das tue ich: $gcc my_program.cdamit ich es ausführen kann.
  5. Ich mache Folgendes: $time ./a.out(„a.out“ ist der Name des Binärobjekts von my_program.c), um die Zeit (nennen wir sie T) zu ermitteln, die für die Ausführung des Programms benötigt wird, und ich erhalte:

    real    0m0.059s
    user    0m0.000s
    sys     0m0.004s
    

Es wird angenommen, dass die Zeit T, nach der ich suche, die erste in der Liste ist: die „reale“, da die anderen sich auf andere Ressourcen beziehen, die in meinem System im selben Moment laufen, in dem ich die Ausführung durchführe ./a.out.

Ich habe also N = 1000015 Zeilen und T = 0,059 Sekunden. Wenn ich eine N/T-Division durchführe, erhalte ich eine Frequenz nahe 17 MHz, was offensichtlich nicht korrekt ist.

Dann dachte ich, dass vielleicht die Tatsache, dass auf meinem Computer andere Programme laufen und Hardwareressourcen verbrauchen (ohne weiter zu gehen, das Betriebssystem selbst), dazu führt, dass der Prozessor seine „Verarbeitungsleistung“ „aufteilt“ und der Takt langsamer wird, aber ich bin mir nicht sicher.
Aber ich dachte, wenn das richtig ist, sollte ich auch den Prozentsatz der CPU-Ressourcen (oder des Speichers) ermitteln, den mein Programm verbraucht, weil ich dann wirklich ein (gut) angenähertes Ergebnis über meine tatsächliche CPU-Geschwindigkeit erhalten könnte.
Und das führt mich zu der Frage, wie ich diesen „Ressourcenverbrauchswert“ meines Programms herausfinden kann. Ich dachte über den $ topBefehl nach, aber er wurde sofort verworfen, da mein Programm nur kurz ausgeführt wird (0,059 Sekunden); es ist nicht möglich, durch einfaches Sehen während dieser kurzen Zeit irgendeinen Spitzenwert der Speichernutzung zu erkennen.

Was denken Sie also darüber? Oder was empfehlen Sie mir zu tun? Ich weiß, dass es Programme gibt, die die Arbeit, die ich versuche, erledigen, aber ich ziehe es vor, die reine Bash zu verwenden, weil ich daran interessiert bin, es auf die „universellste Art“ zu tun, die möglich ist (scheint zuverlässiger zu sein).

Antwort1

Das wird nicht funktionieren. Die Anzahl der Taktzyklen, die jeder Befehl zur Ausführung benötigt (es sind ziemlich viele, nicht nur einer), hängt stark von der genauen Mischung der Befehle ab, die ihn umgeben, und variiert je nach CPU-Modell. Außerdem gibt es eingehende Interrupts und der Kernel und andere Aufgaben führen Befehle aus, die mit Ihren vermischt sind. Darüber hinaus ändert sich die Frequenz dynamisch als Reaktion auf Belastung und Temperatur.

Moderne CPUs verfügen über modellspezifische Register, die die genaue Anzahl der Taktzyklen zählen. Sie können diese auslesen und mithilfe eines hochauflösenden Timers einen festgelegten Zeitraum später erneut auslesen und die beiden Werte vergleichen, um die (durchschnittliche) Frequenz in diesem Zeitraum zu ermitteln.

verwandte Informationen