2010-09-26 4 views
5

Récemment, je profile un code Matlab et j'ai été choqué de voir ce qui suit dans une fonction très utilisée:pénalité de performance des variables persistantes dans Matlab

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

En d'autres termes, Matlab a passé environ 9 secondes, sur 198694 fonction appels, en déclarant le CONSTANTS persistant et en vérifiant s'il a été initialisé. Cela représente 13% du temps total passé dans cette fonction.

Est-ce que les variables persistantes sont vraiment pénalisées par les performances dans MATLAB? Ou faisons-nous quelque chose de terriblement mal ici?

MISE À JOUR

@ Andrew J'ai essayé votre exemple de script et je suis très, très perplexe face à la sortie:

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 

J'ai essayé la commande banc() et il a montré ma machine dans la milieu de gamme des machines d'échantillonnage. Exécution d'Ubuntu 64 bits sur un processeur Intel (R) Core (TM) i7, 4 Go de RAM.

+0

Quelle version de Matlab utilisez-vous? – mtrw

+0

MATLAB Version 7.10.0.499 (R2010a) – lindelof

Répondre

8

C'est la manière standard d'utiliser des variables persistantes dans Matlab. Tu fais ce que tu es censé faire. Il y aura des frais généraux notables pour cela, mais vos horaires semblent étonnamment élevés.

Voici un test similaire que j'ai exécuté en Matlab R2009 32 bits sur une machine Intel Core 2 QX9650 de 3,0 GHz sous Windows XP x64. Des résultats similaires sur d'autres machines et versions. Environ 5 fois plus vite que vos horaires.

test:

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

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

Résultats:

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

Quelle version Matlab, OS et CPU sont en cours d'exécution sur vous? Avec quoi CONSTANTS est-il initialisé? Est-ce que la sortie bench() de Matlab semble raisonnable pour votre machine?

Vos horaires semblent élevés. Il peut y avoir un bug ou un problème de configuration à résoudre. Mais si vous voulez vraiment obtenir le code Matlab rapidement, le conseil standard est de le "vectoriser": restructurer le code pour qu'il fasse moins d'appels de fonctions sur des tableaux d'entrée plus grands et utiliser les fonctions vectorisées intégrées de Matlab au lieu des boucles ou du contrôle structures, pour éviter d'avoir 200 000 appels à la fonction en premier lieu. Si possible. Matlab a un surdébit relativement élevé par appel de fonction ou de méthode (voir Is MATLAB OOP slow or am I doing something wrong? pour certains nombres), de sorte que vous pouvez souvent obtenir plus de kilométrage en refacturant pour éliminer les appels de fonction au lieu de rendre les appels de fonction individuels plus rapides.

Il peut être intéressant de comparer certaines autres opérations de base Matlab sur votre machine, pour voir si elle est juste "persistante" qui semble lente. Essayez aussi de profiler juste ce petit script de test call_has_persistent pour voir si le contexte de votre fonction fait la différence.

Questions connexes