2010-09-26 4 views
5

Recentemente ho profila un codice MATLAB e sono stato scioccato nel vedere quanto segue in una funzione molto utilizzato:sull'andamento di variabili persistenti in MATLAB

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

In altre parole, MATLAB speso circa 9 secondi, oltre 198.694 la funzione chiama, dichiarando il persistente CONSTANTS e controllando se è stato inizializzato. Questo rappresenta 13% del tempo totale trascorso in quella funzione.

Le variabili persistenti portano davvero molto di una penalizzazione delle prestazioni in MATLAB? O stiamo facendo qualcosa di terribilmente sbagliato qui?

UPDATE

@Andrew Ho cercato il tuo script di esempio e sono molto, molto perplesso l'output:

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 

ho provato il comando banco() ed ha mostrato la mia macchina nel gamma media delle macchine campione. Esecuzione di Ubuntu 64 bit su una CPU i7 Intel (R) Core (TM), 4 GB di RAM.

+0

Quale versione di Matlab è in esecuzione? – mtrw

+0

MATLAB versione 7.10.0.499 (R2010a) – lindelof

risposta

8

Questo è il modo standard per utilizzare le variabili persistenti in Matlab. Stai facendo quello che dovresti. Ci sarà un overhead notevole per questo, ma i tuoi tempi sembrano sorprendentemente alti.

Ecco un test simile eseguito in Matlab R2009b a 32 bit su una macchina Intel Core 2 QX9650 da 3,0 GHz in Windows XP x64. Risultati simili su altre macchine e versioni. Circa 5 volte più veloce dei tempi.

prova:

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

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

Risultati:

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

Quale versione di Matlab, OS e CPU sono in esecuzione su? Con cosa viene inizializzato CONSTANTS? L'output di Matlab bench() sembra ragionevole per la tua macchina?

I tuoi orari sembrano alti. Ci può essere un bug o problema di configurazione lì per risolvere. Ma se vuoi veramente ottenere velocemente il codice Matlab, il consiglio standard è di "vettorializzare": ristrutturare il codice in modo che faccia meno chiamate di funzione su matrici di input più grandi, e faccia uso delle funzioni vettoriali incorporate di Matlab invece dei loop o del controllo strutture, per evitare di avere 200.000 chiamate alla funzione in primo luogo. Se possibile. Matlab ha un overhead relativamente alto per chiamata di funzione o metodo (vedere Is MATLAB OOP slow or am I doing something wrong? per alcuni numeri), quindi spesso è possibile ottenere un maggior chilometraggio mediante il refactoring per eliminare le chiamate di funzione invece di rendere più veloci le singole chiamate di funzione.

Può valere la pena eseguire un benchmark su alcune altre operazioni di base di Matlab sulla macchina, per vedere se è solo "persistente" che sembra lento. Prova anche a profilare solo questo piccolo script di test call_has_persistent per vedere se il contesto della tua funzione fa la differenza.