Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

je ne me souviens plus où, mais peu importe, j'avais vu ce comparatif de 2 solutions différentes pour résoudre le même problème, l'une via boucle, l'autre via boucle + tableau. La différence de vitesse d'exécution est étonnante.
J'ai bien compris qu'avec un ou des tableaux les calculs se faisaient virtuellement et sont, par conséquent, beaucoup plus rapides, mais j'avoue avoir du mal à saisir toute la subtilité de la procédure que j'ai nommée "Fast".
Pour les curieux et ceux qui s'imagineraient que les performances dépendent essentiellement de la fréquence ou du nombre de cœurs du microprocesseur, voir PJ.
Et je ne doute pas un instant que l'on puisse aller encore plus vite...
 

Pièces jointes

Dernière édition:
Re : Boucle vs Tableau

bonjour,
intéressant!
je ne sais pas si la méthode est bonne mais j'ai utilisé "now" pour avoir le temps de calcul des deux méthodes, voir pj

j'ai enlevé les valeurs car le fichier avait enflé mais j'ai mis un bouton pour remettre de 5 à 35000

bonne matinée
 

Pièces jointes

Re : Boucle vs Tableau

Salut Magic_Doctor, pierrejean, nicopec, le forum,

J'ai (mais d'autre ont du le faire aussi) abordé ce sujet en plusieurs occasions.
La différence de vitesse est principalement du au fait que les informations sont "transférées" en mémoire et donc traitée de façon beaucoup plus rapide. La lecture de cellules étant très consommatrice de temps car il faut schématiquement : "trouver" la cellule, interpréter son contenu, effectuer le calcul, remettre le résultat dans la cellule, etc...dans un tableau en mémoire, tout est traité nativement par le processeur. C'est donc beaucoup plus rapide, indépendamment de la plateforme hardware.

De même il est préférable d'utiliser un For Each quand on ne connait pas la taille d'une collection que l'on parcours, alors qu'en général la taille d'un tableau est très souvent connue. Ceci favorisant forcément aussi la vitesse de traitement.

Pour plus d'info: voir Microsoft KB129931

Pour le code, très similaire à Utiliser les variables tableaux en VBA Excel

@Nicopec: pour mesurer le temps de calcul il vaut mieux avoir recours à l'API gettickcount.


Bonne semaine à tous
 
Re : Boucle vs Tableau

Bonjour à tous,

pierrejean tu as tout à fait raison, le "Debug.Print" est superflu ; je l'avais mis pour tâcher de mieux comprendre ce qui se passait.
nicopec, j'ai voulu essayer ce que vous avez fait, ça n'a pas marché chez moi.
Jam, en effet, c'est bien là où j'avais trouvé cette solution. J'avais bien compris l'intérêt de faire les calculs virtuellement plutôt que physiquement. En revanche je n'ai toujours pas saisi le contenu de cette solution.

Pour m'amuser, j'ai tenté d'appliquer cette solution pour "décortiquer" des adresses (20.000). Dans une 1ère colonne se trouvent les adresses (Nº et noms de rues/boulevards...) que l'on a entrées. Dans une colonne contiguë apparaissent les Nº, dans la colonne suivante les noms de rues. Ça marche pour les Nº, mais pas pour les noms de rues. Pourquoi ??
 

Pièces jointes

Re : Boucle vs Tableau

Bonjour Magic_doctor, vous avez remis le jeu de données jusqu'à 35000 avec le premier bouton? en tout cas le décompte du temps de calcul n'est pas très pertinent pour des durées si petites par cette méthode, je ne connais pas gettickcount, je regarderais
pour ton code c'est un peu compliqué pour moi mais je vois bien l'appel de la fonction numéro mais celle de la rue est après des apostrophes...
 
Re : Boucle vs Tableau

Bonjour à tous

j'ai intégré un chrono en centièmes de secondes pour mieux voir les différences, c'est assez parlant.

Cordialement, @+

Code:
Sub Slow()
    Dim TheTime(1 To 4) As Long, TheTimerStart As Double, TheTimerStop As Double
    Dim Message As String
    Dim i As Byte, y As Integer
    
    TheTimerStart = Timer
    
    'Mettre le code à exécuter et dont on mesure le temps d'exécution ici
    Dim ObjCell As Range
    For Each ObjCell In [bigplage].Cells
        ObjCell.Value = Sqr(ObjCell.Value * Sqr(2) + Log(3))
    Next
    TheTimerStop = Timer - TheTimerStart
    
    If TheTimerStop < 0 Then TheTimerStop = TheTimerStop + 86400 'si déroulement à 0:00
    TheTime(1) = Fix(TheTimerStop / 3600)
    TheTime(2) = Fix((TheTimerStop - (TheTime(1) * 3600)) / 60)
    TheTime(3) = Fix(TheTimerStop - ((TheTime(1) * 3600) + (TheTime(2) * 60)))
    TheTime(4) = CInt((TheTimerStop - Fix(TheTimerStop)) * 100)
    
    Message = "Macro exécutée en " & Right("0" & TheTime(1), 2) & " heures, " & Right("0" & TheTime(2), 2) & " minutes, " _
    & Right("0" & TheTime(3), 2) & " secondes et " & Right("0" & TheTime(4), 2) & " centièmes de secondes."
      
    MsgBox Message, vbOKOnly
End Sub
Sub Fast()
    Dim TheTime(1 To 4) As Long, TheTimerStart As Double, TheTimerStop As Double
    Dim Message As String
    Dim i As Byte, y As Integer
    
    TheTimerStart = Timer
    
    'Mettre le code à exécuter et dont on mesure le temps d'exécution ici
    Dim Montab As Variant, cmpt1 As Long, cmpt2 As Long
    
    Montab = [bigplage].Value
    
    For cmpt1 = LBound(Montab, 1) To UBound(Montab, 1)
        For cmpt2 = LBound(Montab, 2) To UBound(Montab, 2)
            Montab(cmpt1, cmpt2) = Sqr(Montab(cmpt1, cmpt2) * Sqr(2) + Log(3))
            Debug.Print Montab(cmpt1, cmpt2)
        Next cmpt2
    Next cmpt1
    
    [bigplage].Value = Montab
    TheTimerStop = Timer - TheTimerStart
    
    If TheTimerStop < 0 Then TheTimerStop = TheTimerStop + 86400 'si déroulement à 0:00
    TheTime(1) = Fix(TheTimerStop / 3600)
    TheTime(2) = Fix((TheTimerStop - (TheTime(1) * 3600)) / 60)
    TheTime(3) = Fix(TheTimerStop - ((TheTime(1) * 3600) + (TheTime(2) * 60)))
    TheTime(4) = CInt((TheTimerStop - Fix(TheTimerStop)) * 100)
    
    Message = "Macro exécutée en " & Right("0" & TheTime(1), 2) & " heures, " & Right("0" & TheTime(2), 2) & " minutes, " _
    & Right("0" & TheTime(3), 2) & " secondes et " & Right("0" & TheTime(4), 2) & " centièmes de secondes."
      
    MsgBox Message, vbOKOnly

End Sub
 
Dernière édition:
Re : Boucle vs Tableau

Bonjour Magic_Doctor, le fil,

Ici l'entrée d'une formule matricielle est nettement plus rapide que la solution du tableau VBA :

Code:
Sub Fast2()
Dim t
t = Timer
ThisWorkbook.Names.Add "M", [bigplage].Value
[bigplage].FormulaArray = "=SQRT(M*SQRT(2)+LN(3))"
MsgBox Timer - t
End Sub
Fichier joint.

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour