J'ai comparé ces deux méthodes :
Sous-fonction :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function test_sf
pause(.5)
disp('start')
% Augmentez ou diminuez la valeur suivante en fonction
% des capacités de votre configuration
n=15000000;
V=rand(n,1);
disp(V(end)) % Pour vérification
pause(2)
disp('DoubleFlip')
V=doubleflip_sf(V);
disp(V(1)) % Pour vérification
pause(2)
function W=doubleflip_sf(V)
W = 2*V(end:-1:1);
pause(2) |
Fonctions Imbriquées (sans argument) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| function test_nf
pause(.5)
disp('start')
% Augmentez ou diminuez la valeur suivante en fonction
% des capacités de votre configuration
n=15000000;
V=rand(n,1);
pause(2)
disp(V([1 end])) % Pour vérification
pause(2)
disp('DoubleFlip')
doubleflip_nf;
disp(V([1 end])) % Pour vérification
pause(2)
function doubleflip_nf
V = 2*V(end:-1:1);
pause(2)
end
end |
Avec un vecteur V classe Double de taille 15000000x1 => 15000000*8/1024/1024 = 115 Mo (environ)
J'ai utilisé l'outil MATLAB Monitoring Tool disponible sur le FEX, comme ceci :
monitormatlab;test_sf;pause(5);test_nf;
Voici le graphique obtenu :
Note : il y a un résidu de mémoire MATLAB constant d'environ 10 Mo, le graphique est donc légèrement décalé vers le haut
Evolution de la mémoire MATLAB (lancement de monitormatlab, appel de test_sf, pause de 5s , appel de test_nf) :
- Appel de test_sf, la mémoire grimpe à 115 Mo à la définition de la variable V.
- Appel de doubleflip_sf, la mémoire monte à 230 Mo (V+W)
- Sortie de doubleflip_sf, la mémoire chute à 115 Mo (destruction de W)
- Sortie de test_sf, la mémoire revient à 0 Mo
- Palier de 5s à 0 Mo
- Appel de test_nf, la mémoire MATLAB grimpe à 115 Mo à la définition de la variable V.
- Appel de doubleflip_nf, la mémoire reste à 115 Mo (pas de vecteur temporaire crée)
- Sortie de doubleflip_nf, la mémoire reste à 115 Mo
- Sortie de test_nf, la mémoire revient à 0 Mo
Partager