Question 167

Comment améliorer les performances (augmenter la vitesse) de mon application ?

Si la question est récurrente, la réponse n'est pas simple pour autant. Comme principe général, il faut se souvenir que les problèmes de performances sont plus souvent à imputer à l'algorithme choisi qu'à son implémentation. Nous présenterons ici des techniques générales afin d'accélérer le fonctionnement d'une application.

Préallouer de la mémoire

Lorsque de nombreuses allocations mémoire sont nécessaires, il est utile d'allouer un bloc de mémoire à l'avance et d'ensuite épuiser cette réserve. En effet, les allocations mémoire sont généralement coûteuses en temps d'exécution. En réduire le nombre est donc gage de performances.

Cette technique peut être utilisée pour :

  • Concaténer très rapidement des chaînes de caractères. On préalloue une chaîne de grande taille, que l'on remplit au fur et à mesure. En cas de besoin, on réalloue un ou plusieurs blocs de grandes tailles.
  • Réaliser des réallocations de tableaux. On réserve un grand nombre d'éléments, que l'on utilise au fur et à mesure; Cette technique est utilisée dans l'ArrayList.

Utiliser d'autres langages

Il est parfois impossible d'implémenter efficacement un algorithme en VB, notamment parce que la manipulation de pointeurs et certains opérateurs tels que le left shift ou le right shift ne sont pas présents nativement. Il peut alors être utile d'utiliser d'autres langages, tels que le C, C++ ou l'assembleur qui possèdent les facilités requises. Ceci peut notamment être fait à l'aide de Dll standards, Dll COM, ou de n'importe quel support de communication efficace.

Manipuler les String avec des $, éviter les Variant

Visual Basic propose un type extrêmement permissif nommé Variant. Ce "super-type" permet de contenir aussi bien des chaînes de caractères que des objets ou des entiers. Cette flexibilité a un coût non négligeable sur les performances, ce qui vaut au Variant la dénomination de "type lent". Il est donc conseillé de n'utiliser ce type que lorsqu'aucune alternative n'est envisageable.

De la même manière, les fonctions de manipulation de chaînes de caractères se déclinent souvent en deux versions, l'une d'entre elle étant suffixée d'un $. La version "sans $" utilise et renvoie des données de type Variant, la conversion de String vers Variant et vice-versa étant effectuée si nécessaire. L'autre version travaille directement avec des données de type String et présente de nettement meilleures performances. Il est donc préférable d'utiliser Mid$() au lieu de Mid().

Traiter les données utiles

Lorsque des données sont extraites d'un fichier, d'une base de données, etc. il faut, dans la mesure du possible, n'en extraire que la partie utile. Extraire des données pour ensuite les ignorer a toujours un impact négatif sur les performances. Il peut être utile de changer la manière dont sont stockées les données, s'il est impossible de réaliser cette extraction directement.

Changer les données à la source n'est pas toujours désirable ou même possible. Néanmoins, il est souvent envisageable de transformer l'agencement des données au chargement de l'application, afin d'accélérer le fonctionnement par la suite. Par exemple, si la source de données est un dictionnaire en tant qu'une liste de mots, pour connaître l'existence d'un mot dans le dictionnaire, celui-ci pourrait être chargé une seule fois au démarrage de l'application dans une table de hachage.

Ne pas vouer une confiance aveugle aux librairies

De nombreuses librairies fournissent des services très utiles. Néanmoins, il faut toujours porter attention à l'optique dans laquelle la librairie a été conçue et particulièrement si les performances étaient prioritaires. La librairie de scripting FSO, qui permet la manipulation de fichiers, illustre ce point. L'énumération de fichiers à l'aide de FSO est particulièrement lente. En effet, les scripts sont généralement conçus pour être utilisés sans contact avec l'utilisateur et dans un environnement interprété qui est lui-même lent. FSO a donc pour objectif de fournir une grande flexibilité et non des performances optimales.

Dans le cas des composants COM, il faut remarquer que l'early binding permet d'atteindre une plus grande vitesse d'exécution.

Connaître les options de compilation

Visual Basic offre de nombreuses facilités permettant de limiter les fréquentes vérifications assurant que le code n'effectuera pas une opération involontaire. Ces opérations incluent l'accès involontaire à un élément hors des bornes d'un tableau, le dépassement de capacité d'un entier, etc.. Une section entière de l'aide de Visual Basic est consacrée à la compilation et aux optimisations possibles.

Mesurer le gain

Enfin, lorsque les performances souhaitées auront été atteintes, il sera temps de vérifier quantitativement les gains. La réalisation d'un benchmark est alors utile. Néanmoins, il est important de réaliser de tels tests dans de bonnes conditions. Cela signifie plusieurs choses :

  • Les données de test doivent être aussi proches que possible des données réelles. Ceci permet de pouvoir estimer les temps réellement mis en jeu en production et de ne pas mettre en jeu une propriété particulière qu'auraient les données de test.
  • La machine de test doit pouvoir être une machine de production. Ceci signifie que l'application doit pouvoir fonctionner suffisamment rapidement sur des machines dont la configuration correspond à la configuration minimale demandée. Il faut aussi faire attention à la configuration logicielle : l'ajout d'un simple antivirus peut ralentir visiblement les temps d'accès aux fichiers.
  • Les tests doivent être répétés un grand nombre de fois. Il est possible qu'un test, réalisé à un moment donné, ait eu les performances attendues par accident. Au plus le nombre de répétition est grand, au moins il y a de risque d'erreur sur la mesure de la vitesse moyenne d'exécution.

Pour aller plus loin

  • VBSpeed, la référence en matière de code rapide sous Visual Basic
  • StopWatch, sur le site de Karl E. Peterson, expliquant comment réaliser efficacement un benchmark
  • VB Profiler, où de nombreuses méthodes pour optimiser du code sont exposées
Date de publication : 13 septembre 2007
Dernière modification : 11 septembre 2008
Rubriques : Divers
Mots-clés : performance, vitesse, rapidité, vite, rapide, accélérer, lent, lenteur