5 Stimmen

Wie kann man die Leistung unabhängig von der verwendeten Maschine messen?

Ich hatte eine Routine, die gut funktionierte. Ich musste jedoch eine Änderung vornehmen. Die Änderung verbesserte die Präzision der Übung, beeinträchtigte aber die Leistung.

Die Routine besteht aus vielen mathematischen Berechnungen und ist wahrscheinlich CPU-gebunden (ich muss das noch genauer testen, aber ich bin mir zu 99% sicher). Es ist in C++ geschrieben (Compiler ist Borland C++ 6).

Ich möchte jetzt die Leistung der Routine messen. Zuerst dachte ich daran, die Ausführungszeit zu messen, aber das ist meiner Meinung nach ein ziemlich fehlerhafter Ansatz, da viel mehr Dinge passieren könnten.

Ich bin damals auf dieses Thema gestoßen: Techniken zur Messung der Anwendungsleistung - Stack Overflow . Mir gefiel die Idee der Messung durch MFlops.

Mein Chef schlug vor, eine Art Messung nach CPU-Taktzyklen zu verwenden, damit die Tests maschinenunabhängig sind, aber ich denke, dieser Ansatz fällt in die MFlops-Tests.

Meiner Meinung nach ist die Messung beider Dinge (Ausführungszeit und MFlops) der richtige Weg, aber ich würde gerne von den Stackoverflow-Experten hören, was ihr denkt.

Wie kann man die Leistung einer Routine messen, die als CPU-Bindung bekannt ist?

7voto

MSalters Punkte 166675

Die CPU-Taktzyklen sind auch nicht so wichtig, wenn Ihre Anwendung speichergebunden ist. Auf einer schnelleren CPU verbringen Sie einfach mehr CPU-Zyklen mit dem Warten auf denselben Cache-Miss. (Mathematische Anwendungen sind wahrscheinlich nicht I/O-gebunden).

Ein weiteres Problem ist, dass die Anzahl der Taktzyklen für eine bestimmte Befehlssequenz von Architektur zu Architektur variiert (und das gilt auch für Intel Core1 / Core2). Als absolutes Maß für die Leistung ist die Anzahl der Taktzyklen bei einer CPU also kaum eine Verbesserung.

Ich würde behaupten, dass sie in der Tat schlechter sind als die anderen. Im Gegensatz zur Zeit sind den Nutzern die Zyklen egal. Das ist vor allem bei modernen Multi-Core-CPUs wichtig. Ein "ineffizienter" Algorithmus, der die doppelte Anzahl von Zyklen und 3 Kerne verwendet, wird in 67 % der Zeit fertig. Den Benutzern wird das wahrscheinlich gefallen.

3voto

Mike Dunlavey Punkte 39339

Ihre Frage impliziert, dass die Software bereits so schnell ist, wie sie nur sein kann, abgesehen von dem Problem der Genauigkeit. Ich habe festgestellt, dass das nicht oft der Fall ist, und ich gehe davon aus, dass Sie es wirklich so schnell machen wollen.

Ich würde vorschlagen, dass Messung geht an der Sache vorbei.

Was Sie wirklich tun müssen, ist ausfindig machen. die Anweisungen oder Instruktionen (nicht Funktionen), die 1) für einen signifikanten Anteil der Wallclock-Zeit verantwortlich sind und 2) die Sie optimieren können.

Unter der Annahme, dass die Software eine nicht triviale Größe hat, ist es wahrscheinlich, dass sie zumindest ein paar Schichten von Funktionsaufrufen enthält, und es ist durchaus möglich, dass einige dieser Funktionsaufrufe (nicht Funktionen, Funktions ruft auf. ) sind für einen erheblichen Zeitanteil verantwortlich und könnten optimiert werden.

Diese ist ein sehr guter Weg, um sie zu finden, und こん ist ein Beispiel für seine Verwendung.

2voto

Stephen Doyle Punkte 3714

Ich stimme mit Ihrem Chef überein - messen Sie in Form von CPU-Taktzyklen. Seien Sie sich jedoch darüber im Klaren, dass auch andere Dinge vor sich gehen könnten, wie z.B. eine Menge Cache-Misses, die Ihren Code verlangsamen. Wenn Sie können, verwenden Sie VTune oder eines der kostenlosen Tools von Intel, um die Art des Engpasses festzustellen.

2voto

David Thornley Punkte 55244

CPU-Taktzyklen sind heutzutage nicht mehr maschinenunabhängig, selbst bei CPUs, die den gleichen Befehlssatz verwenden. Der x86-Maschinencode (oder was auch immer) wird auf alle möglichen Arten und Weisen zerlegt und zerschnitten. Die Zeiten, in denen dies etwas bedeutete, sind längst vorbei (und als CPU-Zyklen noch etwas bedeuteten, waren so viele verschiedene CPU-Typen im Einsatz, dass es ohnehin maschinenabhängig war).

Ganz zu schweigen davon, dass CPU-gebunden nicht mehr so eindeutig ist wie früher, was mit Cache-Misses und so weiter. Früher war ein CPU-gebundener Prozess einer, der nur durch E/A und so begrenzt war, da ein Speicherzugriff eine bestimmte Anzahl von CPU-Zyklen benötigt.

Was Sie zu messen versuchen, ist die Leistung, d. h. wie schnell es läuft. In diesem Fall ist es wahrscheinlich am besten, die Wanduhrzeit zu messen und die Berechnung so oft zu wiederholen, dass Sie aussagekräftige Ergebnisse erhalten. Sie könnten ein Testprogramm erstellen, das verschiedene Implementierungen durchläuft, so dass Sie vergleichbare Ergebnisse erhalten.

1voto

Alan Jackson Punkte 6093

Messung der Ausführungszeit ist der richtige Weg.

In diesem Fall denke ich, dass Sie minimieren Sie, was Sie messen um die Anzahl der Variablen zu reduzieren.

Als nächstes wäre es eine gute Idee, eine Grundlinie um diese spezielle Maschine zu kalibrieren. Verwenden Sie entweder die zuletzt eingecheckte Version oder eine intensive Routine, die in etwa der Art der Berechnung entspricht, die Sie zu messen versuchen. Dann können Sie den Benchmark wie folgt ausdrücken

relative_time = measured_time_for_routine / measured_time_for_baseline

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X