Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
tutoriel:programmation:vba:optimisationvba [2020/10/25 14:37] admintutoriel:programmation:vba:optimisationvba [2022/08/13 21:58] (Version actuelle) – modification externe 127.0.0.1
Ligne 11: Ligne 11:
   * http://www.aivosto.com/vbtips/vbtips.html   * http://www.aivosto.com/vbtips/vbtips.html
  
-====== Avant propos ======+===== Avant propos =====
  
 Voici un petit recueil d'idées pour réaliser une optimisation des programmes en VBA. IL résulte de mes propres expériences et lectures. D'une manière générale, il n'est pas évident de savoir si telle ou telle forme optimise un algorithme. IL convient par conséquent de tester soi-même, différente forme pour en garder que les meilleurs... Ce tutoriel hiérarchise un peu ces différentes formes qu’on peut imaginer. Voici un petit recueil d'idées pour réaliser une optimisation des programmes en VBA. IL résulte de mes propres expériences et lectures. D'une manière générale, il n'est pas évident de savoir si telle ou telle forme optimise un algorithme. IL convient par conséquent de tester soi-même, différente forme pour en garder que les meilleurs... Ce tutoriel hiérarchise un peu ces différentes formes qu’on peut imaginer.
Ligne 18: Ligne 18:
 Dans une certaine mesure, ces optimisations sont applicables pour un programme VB compilé. Dans une certaine mesure, ces optimisations sont applicables pour un programme VB compilé.
  
-====== Généralités ======+===== Généralités =====
  
 Par optimisation, je considère la vitesse d'exécution uniquement. Néanmoins, il me semble assez logique, qu'on puisse interpréter l'optimisation de différentes façons. Par exemple, on peut considérer l'optimisation comme l'algorithme le plus court, le plus simple, le plus clair afin d'en faciliter la relecture ultérieure, ou encore le moins gourmand en ressource matériel, etc... Ces aspects sont tout aussi louables que l'optimisation de la vitesse, et se cumulent souvent... EN réalité, le programmeur doit souvent faire des compromis entre ces différents aspects... Par optimisation, je considère la vitesse d'exécution uniquement. Néanmoins, il me semble assez logique, qu'on puisse interpréter l'optimisation de différentes façons. Par exemple, on peut considérer l'optimisation comme l'algorithme le plus court, le plus simple, le plus clair afin d'en faciliter la relecture ultérieure, ou encore le moins gourmand en ressource matériel, etc... Ces aspects sont tout aussi louables que l'optimisation de la vitesse, et se cumulent souvent... EN réalité, le programmeur doit souvent faire des compromis entre ces différents aspects...
Ligne 25: Ligne 25:
 Mais, la meilleure optimisation reste d’un autre ordre non évoqué ici, consistant à trouver le meilleur algorithme, qui dépend que de votre réflexion ! Mais, la meilleure optimisation reste d’un autre ordre non évoqué ici, consistant à trouver le meilleur algorithme, qui dépend que de votre réflexion !
  
-====== Optimisation des variables ======+===== Optimisation des variables =====
  
-===== Déclarations des variables =====+==== Déclarations des variables ====
  
 La déclaration du type de variable est une première optimisation extrêmement classique et indispensable.  La déclaration du type de variable est une première optimisation extrêmement classique et indispensable. 
Ligne 54: Ligne 54:
 </note> </note>
  
-===== Utilisation des tableaux (Dim) =====+==== Utilisation des tableaux (Dim) ====
  
 Quelques évidences. Quelques évidences.
Ligne 64: Ligne 64:
 Par exemple, éviter de réutiliser Redim (Preserve). Par exemple, éviter de réutiliser Redim (Preserve).
  
-====== Optimisation sur les nombres ======+===== Optimisation sur les nombres =====
  
-===== Longueur d'un nombre entier positif ou nul =====+==== Longueur d'un nombre entier positif ou nul ====
  
 Pour connaître le nombre de chiffres Pour connaître le nombre de chiffres
Ligne 80: Ligne 80:
   Fix(Log(Abs(nb) + 0.11) / Log(10)) + 2   Fix(Log(Abs(nb) + 0.11) / Log(10)) + 2
  
-===== Parité d’un nombre =====+==== Parité d’un nombre ====
  
   * Pour tester si un nombre est pair :   * Pour tester si un nombre est pair :
Ligne 92: Ligne 92:
 <note tip>Entre ces deux formes, cette dernière est plus rapide car il n’y a pas de test d’égalité (=0) qui pernd du temps. </note> <note tip>Entre ces deux formes, cette dernière est plus rapide car il n’y a pas de test d’égalité (=0) qui pernd du temps. </note>
  
-===== Calculs des puissances entières =====+==== Calculs des puissances entières ====
  
 Curieuse fonction que " ^ " qui s’effectue en un temps quasi-constant quelle que soit la puissance, mais reste moins rapide que la multiplication successive jusqu’à puissance 9 environ. Curieuse fonction que " ^ " qui s’effectue en un temps quasi-constant quelle que soit la puissance, mais reste moins rapide que la multiplication successive jusqu’à puissance 9 environ.
Ligne 98: Ligne 98:
   nb = lg * lg * ... * lg   nb = lg * lg * ... * lg
  
-===== Calcul de la racine carrée =====+==== Calcul de la racine carrée ====
  
   lg = Sqr(nb)   lg = Sqr(nb)
Ligne 104: Ligne 104:
 <note tip>Comme pour les puissances, on peut cumuler les racines carrés optimisées jusqu’à 4. Ainsi lg = Sqr(Sqr(Sqr(Sqr(nb)))) est la dernière expression plus rapide que lg = nb ^ 0.0625.</note> <note tip>Comme pour les puissances, on peut cumuler les racines carrés optimisées jusqu’à 4. Ainsi lg = Sqr(Sqr(Sqr(Sqr(nb)))) est la dernière expression plus rapide que lg = nb ^ 0.0625.</note>
  
-===== Division entière =====+==== Division entière ====
  
 Si les nombres peuvent être déclarés en type Long sans dépassement de capacité, Si les nombres peuvent être déclarés en type Long sans dépassement de capacité,
Ligne 110: Ligne 110:
   nb = nb1 \ nb2   nb = nb1 \ nb2
  
-===== Pré-calcul =====+==== Pré-calcul ====
  
 Il faut sortir d'une boucle tous les calculs d’expression constante. Il faut sortir d'une boucle tous les calculs d’expression constante.
Ligne 118: Ligne 118:
   lg = nb * z   lg = nb * z
  
-===== Maximum et Minimum de 2 nombres =====+==== Maximum et Minimum de 2 nombres ====
  
   if a<b then max=b else max=b   if a<b then max=b else max=b
   if a<b then min=a else min=b   if a<b then min=a else min=b
  
-====== Optimisation des tests ======+===== Optimisation des tests =====
  
-===== Vérification d’une condition avec renvoi Booléan =====+==== Vérification d’une condition avec renvoi Booléan ====
  
   a=(condition)   a=(condition)
Ligne 132: Ligne 132:
 L’interprétation est facile, si b=c alors VB remplace en interne cette condition par la valeur vraie (True), puis l’affecte à "a", soit a=True. Même chose dans le cas contraire, avec False. Cette optimisation n'est valable que pour le renvoi d’une valeur Boolean. L’interprétation est facile, si b=c alors VB remplace en interne cette condition par la valeur vraie (True), puis l’affecte à "a", soit a=True. Même chose dans le cas contraire, avec False. Cette optimisation n'est valable que pour le renvoi d’une valeur Boolean.
  
-===== Fonctions conditionnelles =====+==== Fonctions conditionnelles ====
  
 (non exhaustif vu les très nombreuses formes imaginables) (non exhaustif vu les très nombreuses formes imaginables)
Ligne 162: Ligne 162:
 On pourrait se poser la question si on a une série de conditions rassemblées avec un opérateur logique, par exemple OR. Mais la structure " If... Then... ElseIf... End If " pourrait être toujours utilisée et resterait le plus rapide, malgré une très grosse lourdeur dans le codage, puisqu'il faut répéter x fois les mêmes instructions... On pourrait se poser la question si on a une série de conditions rassemblées avec un opérateur logique, par exemple OR. Mais la structure " If... Then... ElseIf... End If " pourrait être toujours utilisée et resterait le plus rapide, malgré une très grosse lourdeur dans le codage, puisqu'il faut répéter x fois les mêmes instructions...
  
-===== Les différentes écritures de If =====+==== Les différentes écritures de If ====
  
 En VBA, les différentes formes d'écriture de l'instruction "IF" ont une influence sur la vitesse d'exécution. En VBA, les différentes formes d'écriture de l'instruction "IF" ont une influence sur la vitesse d'exécution.
Ligne 169: Ligne 169:
   If (condition) Then (instructions1) Else (instructions2)   If (condition) Then (instructions1) Else (instructions2)
  
-====== Optimisation des références ======+===== Optimisation des références =====
  
 Lorsque des objets sont appelés plusieurs fois, il est avantageux d’utiliser "With". Lorsque des objets sont appelés plusieurs fois, il est avantageux d’utiliser "With".
Ligne 189: Ligne 189:
   End Sub   End Sub
      
-====== Optimisation des chaînes ======+===== Optimisation des chaînes =====
  
 Certaines fonctions sur les chaînes existent en deux versions, correspondant soit à un type de données en Variant, soit en String déclaré par le signe dollar ($). Cette dernière version est la plus rapide. Certaines fonctions sur les chaînes existent en deux versions, correspondant soit à un type de données en Variant, soit en String déclaré par le signe dollar ($). Cette dernière version est la plus rapide.
Ligne 232: Ligne 232:
   lg = String$(1000, z)   lg = String$(1000, z)
  
-====== Optimisation des boucles ======+===== Optimisation des boucles =====
  
 La variable d’une boucle doit être déclarée pour être optimale. Option Explicit est donc très pratique ici... La variable d’une boucle doit être déclarée pour être optimale. Option Explicit est donc très pratique ici...
Ligne 242: Ligne 242:
   * DO.. LOOP (UNTIL/WHILE) sinon.</note>   * DO.. LOOP (UNTIL/WHILE) sinon.</note>
  
-===== Boucle for =====+==== Boucle for ====
  
 Forme optimisée : Forme optimisée :
Ligne 259: Ligne 259:
   NEXT   NEXT
  
-===== Boucle do =====+==== Boucle do ====
  
   * Do.. Loop (While/Until)   * Do.. Loop (While/Until)
Ligne 274: Ligne 274:
   Loop Until A = 10000000   Loop Until A = 10000000
  
-===== Exécuter une instruction une fois sur x passages =====+==== Exécuter une instruction une fois sur x passages ====
  
 Forme optimisée : Forme optimisée :
Ligne 284: Ligne 284:
   Next nb   Next nb
  
-====== Optimisation pour Excel ======+===== Optimisation pour Excel =====
  
 Pour un gain global, il peut être intéressant de désactiver certains processus intrinsèques à Excel. Pour un gain global, il peut être intéressant de désactiver certains processus intrinsèques à Excel.