2012-12-20 15 views
16

für eine Idee der Suche, wie in meinem Matlab-Code mit Schleife zu vermeiden, fand ich folgende Anmerkungen unter one question on SE:Wie Matlab-Prozesse zu benchmarken?

Die Aussage „for-Schleifen in Matlab langsam ist“ nicht mehr da Matlab im Allgemeinen wahr ... euhm , R2008a?

und

Haben Sie Benchmarks für eine versuchte Schleife vs was Sie bereits haben? manchmal ist es schneller als vektorisiert Code ist ...

So würde ich fragen, ist es häufig verwendete Art und Weise die Geschwindigkeit eines Prozesses in Matlab zu testen? Kann Benutzer irgendwo sehen, wie viel Zeit der Prozess dauert oder der einzige Weg ist die Prozesse für mehrere Minuten zu verlängern, um die Zeiten miteinander zu vergleichen?

Antwort

22

Das beste Werkzeug zum Testen der Leistung von MATLAB-Code ist die timeit-Funktion von Steve Eddins, available here aus dem MATLAB Central File Exchange.

Es behandelt viele subtile Fragen im Zusammenhang mit Benchmarking MATLAB-Code für Sie, wie zum Beispiel:

  • dass JIT-Kompilierung sichergestellt durch Wickeln des gebenchmarktes Code in einer Funktion verwendet wird
  • den Code aufwärmen
  • läuft die mehrmals Code und

-Update im Durchschnitt: Ab Release R 2013b, timeit ist Teil des Kerns MATLAB.


Update: Ab Release R2016a, MATLAB enthält auch eine performance testing framework, die timeit die oben genannten Fragen für Sie in einer ähnlichen Art und Weise behandelt.

+2

+1 für eine Methode, die ich noch nicht wusste, und das scheint gut durchdacht zu sein. – Thilo

+1

Das Wort "Mittelung" ist bestenfalls irreführend, wenn Timit den Median verwendet, außerdem scheint es keine Möglichkeit zu geben, den Median zu beeinflussen und keine Möglichkeit, die Anzahl der Laufzeiten zu ändern. Weißt du, ob es irgendwie möglich ist, die Standardabweichung in den Laufzeiten zu bekommen? Es wäre nützlich, Maßnahmen bis zu einem gewissen Grad zu treffen. – hhh

+0

@hhh Ich bin nicht sicher, was an diesem Wort irreführend ist - der Median ist ein Durchschnitt. Wie auch immer - es ist ziemlich einfach, die Funktionalität von 'timeit' zu ändern, wenn Sie möchten (ich beziehe mich hier auf die File Exchange-Version und nicht auf die neuere, integrierte Version, aber ich würde erwarten, dass sie ähnlich sind). Geben Sie 'edit timeit' ein, um die Interna der Funktion zu sehen, und Sie werden sehen, dass sie die Funktion mehrmals ausführt und dann' median' auf ihnen aufruft. Ändern Sie einfach 'timeit', um die einzelnen Zeiten auszugeben, und Sie können jede beliebige Form von Durchschnitt oder Standardabweichungen verwenden. –

13

Mit dem Profiler können Sie feststellen, wie viel Zeit Ihre Funktionen und die darin enthaltenen Codebausteine ​​benötigen.

Viewer löscht auch die aktuellen Profildaten für das nächste Mal.

Denken Sie daran, Profil neigt dazu, die Ausführung ein wenig zu verlangsamen, aber ich glaube, dass es in einer einheitlichen Art und Weise über alles tut.

Offensichtlich, wenn Ihre Funktion sehr schnell ist, könnten Sie feststellen, dass Sie keine zuverlässigen Ergebnisse erhalten, also wenn Sie es viele Male ausführen oder die Berechnung erweitern können, die die Sache verbessern würde.

Wenn es wirklich einfache Sachen Sie testen, können Sie es auch nur Zeit tic und toc mit:

>> tic; % Start the timer 
>> myfunctionname(); 
>> toc; % End the timer and display elapsed time 

Auch wenn Sie mehrere Timer wollen, können Sie sie auf Variablen zuweisen:

>> mytimer = tic; 
>> myfunctionname(); 
>> toc(mytimer); 

Schließlich, wenn Sie wollen, anstatt Anzeige der verstrichenen Zeit speichern es:

>> myresult = toc; 
+4

Der Profiler verlangsamt die Ausführung nicht auf eine Weise, die notwendigerweise einheitlich ist. Es deaktiviert den JIT-Compiler, der sehr unterschiedliche Auswirkungen auf verschiedene Codeabschnitte haben kann. –

+1

@SamRoberts Wow, ich wusste nicht Profil deaktiviert JIT ... –

5

Ich denke, dass ich recht habe, dass viele von uns Matlab Zeit haben, indem wir den Block von Code zwischen tic und toc einwickeln. Darüber hinaus achten wir darauf, dass die Gesamtzeit in der Größenordnung von 10 Sekunden liegt (statt 1 Sekunden oder 100 Sekunden) und wiederholen Sie es 3-5 Mal und nehmen Sie ein gewisses Maß an zentraler Tendenz (wie der Mittelwert) und daraus Schlüsse ziehen.

Wenn das Stück Code weniger als, sagen wir 10s, dauert, wiederholen Sie es so oft wie nötig, um es in den Bereich zu bringen, wobei darauf geachtet wird, dass keine Iteration auf die nächste wirkt. Und wenn der Code natürlich 100 Sekunden oder länger dauert, verbringen Sie entweder länger mit dem Testen oder versuchen Sie es mit künstlich kleinen Eingabedaten, um schneller zu laufen.

Nach meiner Erfahrung ist es nicht notwendig, Programme für Minuten zu laufen, um Daten mit einer durchschnittlich akzeptablen Laufzeit zu erhalten. Wenn ich ein Programm fünfmal ausführe und eines (oder zwei) der Ergebnisse völlig anders ist als das Mittel, werde ich es erneut ausführen.

Natürlich, wenn der Code irgendwelche Funktionen hat, die seine Laufzeit nicht-deterministisch machen, dann ist es eine andere Sache.

Verwandte Themen