2010-09-26 8 views
5

Vor kurzem habe ich einige MATLAB-Code profiliert und ich war schockiert, die folgenden in einer stark frequentierten Funktion, um zu sehen:Leistungseinbuße von persistenten Variablen in MATLAB

5.76 198694 58 persistent CONSTANTS; 
3.44 198694 59 if isempty(CONSTANTS) % initialize CONSTANTS 

Mit anderen Worten, verbrachte MATLAB etwa 9 Sekunden über 198.694 Funktion Aufrufe, die persistente CONSTANTS deklarieren und prüfen, ob es initialisiert wurde. Das entspricht 13% der Gesamtzeit in dieser Funktion verbracht.

Tragen persistente Variablen in MATLAB wirklich so viel Leistungseinbußen mit sich? Oder machen wir hier etwas schrecklich falsch?

UPDATE

@ Andrew ich Ihr Beispielskript versucht, und ich bin sehr, sehr verwirrt durch die Ausgabe:

time calls line 
       6 function has_persistent 
6.48 200000 7 persistent CONSTANTS 
1.91 200000 8 if isempty(CONSTANTS) 
       9  CONSTANTS = 42; 
       10 end 

ich von der Bank() Befehl versucht, und es zeigte meine Maschine in der mittlerer Bereich der Mustermaschinen. Ubuntu 64 Bit auf einer Intel® Core ™ i7 CPU, 4GB RAM.

+0

Welche Version von Matlab laufen Sie? – mtrw

+0

MATLAB Version 7.10.0.499 (R2010a) – lindelof

Antwort

8

Dies ist die Standardmethode zur Verwendung persistenter Variablen in Matlab. Du machst das, was du tun sollst. Es wird einen merklichen Overhead dafür geben, aber Ihre Zeiten scheinen irgendwie überraschend hoch zu sein.

Hier ist ein ähnlicher Test lief ich in 32-Bit-Matlab R2009b auf einem 3,0 GHz Intel Core 2 QX9650-Rechner unter Windows XP x64. Ähnliche Ergebnisse auf anderen Maschinen und Versionen. Etwa 5x schneller als Ihre Timings.

Test:

function call_has_persistent 
for i = 1:200000 
    has_persistent(); 
end 

function has_persistent 
persistent CONSTANTS 
if isempty(CONSTANTS) 
    CONSTANTS = 42; 
end 

Ergebnisse:

0.89 200000 7 persistent CONSTANTS 
    0.25 200000 8 if isempty(CONSTANTS) 

Was Matlab-Version, Betriebssystem und CPU Sie laufen? Womit werden CONSTANTS initialisiert? Ist Matlabs Bank() -Ausgabe für Ihre Maschine angemessen?

Ihre Timings scheinen hoch. Es könnte ein Fehler oder ein Config-Problem zur Behebung sein. Aber wenn Sie Matlab-Code wirklich schnell erhalten wollen, ist der Standardratschlag, ihn zu "vektorisieren": den Code so umstrukturieren, dass er weniger Funktionsaufrufe auf größeren Eingabearrays durchführt und die von Matlab eingebauten vektorisierten Funktionen anstelle von Schleifen oder Steuerungen verwendet Strukturen, um 200.000 Aufrufe an die Funktion an erster Stelle zu vermeiden. Wenn möglich. Matlab hat einen relativ hohen Overhead pro Funktion oder Methodenaufruf (für einige Zahlen siehe Is MATLAB OOP slow or am I doing something wrong?), so dass Sie durch Refactoring häufig mehr Kilometer erhalten, um Funktionsaufrufe zu eliminieren, anstatt die einzelnen Funktionsaufrufe schneller auszuführen.

Es kann sich lohnen, einige andere grundlegende Matlab-Operationen auf Ihrer Maschine zu vergleichen, um zu sehen, ob es nur "hartnäckig" ist, das langsam scheint. Versuchen Sie auch, dieses kleine call_has_persistent-Testskript isoliert zu erstellen, um festzustellen, ob der Kontext Ihrer Funktion einen Unterschied macht.

Verwandte Themen