Préallocation
Les boucles for
et while
qui augmentent de manière incrémentale la taille d’une structure de données à chaque fois qu’elle passe par la boucle peuvent avoir des effets néfastes sur la performance et l’utilisation de la mémoire. Redimensionner des tableaux de manière répétée exige souvent que MATLAB® passe du temps supplémentaire à chercher des blocs de mémoire contigus plus grands et transfère le tableau dans ces blocs. Souvent, vous pouvez améliorer le temps d’exécution du code en préallouant la quantité maximale d’espace requis pour le tableau.
Le code suivant affiche la quantité de temps nécessaire pour créer une variable scalaire x
, puis pour augmenter progressivement la taille de x
dans une boucle for
.
tic x = 0; for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.301528 seconds.
Si vous préallouez un bloc de mémoire de 1 par 1 000 000 pour x
et que vous l’initialisez à zéro, alors le code s’exécute beaucoup plus vite, car il n’y a pas besoin de réallouer de la mémoire de manière répétée pour la structure de données croissante.
tic x = zeros(1,1000000); for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.011938 seconds.
Utilisez la fonction de préallocation appropriée pour le genre de tableau que vous souhaitez initialiser :
zeros
pour les tableaux numériquesstrings
pour les tableaux de chaînes de caractèrescell
pour les cell arraystable
pour les tableaux de table
Préallouer une matrice non double
Quand vous préallouez un bloc de mémoire pour qu’il contienne une matrice de type différent de double
, évitez d’utiliser la méthode
A = int8(zeros(100));
Cette instruction préalloue une matrice de 100 par 100 de int8
, d’abord en créant une matrice complète de valeurs double
, puis en convertissant chaque élément en int8
. Créer le tableau en tant que valeurs int8
permet de gagner du temps et de la mémoire. Par exemple :
A = zeros(100,'int8');