4D v16.3Conseils d’optimisation |
||
|
4D v16.3
Conseils d’optimisation
Conseils d’optimisation
Il est difficile, voire impossible, de consigner une fois pour toutes des instructions pour “bien programmer”. Tout au plus pouvons-nous renouveler les recommandations générales vous invitant à bien structurer vos programmes, grâce notamment aux possibilités de programmation générique offertes par 4D. Certaines astuces que nous vous conseillons peuvent rendre votre code moins lisible par une personne extérieure ou par vous-même ultérieurement. En conséquence, n’hésitez pas à assortir vos méthodes de commentaires détaillés. En effet, si les commentaires peuvent parfois ralentir une base interprétée, ils n’ont strictement aucune influence sur les temps d’exécution d’une base compilée. Les directives de compilation peuvent vous aider à accélérer considérablement votre code. Par défaut, le compilateur donne le type Réel aux variables numériques non typées par directive de compilation et si les Propriétés de la base n’indiquent pas le contraire. Or, les calculs sur un Réel sont plus lents que sur un Entier. Lorsque vous êtes sûr qu’un de vos numériques s’exprimera toujours dans votre base sous forme d’un Entier, il est avantageux de le déclarer par la directive de compilation C_ENTIER LONG. Par ailleurs, certaines fonctions standard de 4D renvoient des Entiers (exemple : Code de caractere, Ent...). Si vous affectez le résultat d’une de ces fonctions à une variable non typée de votre base, le compilateur lui donnera le type Réel et non Entier. Pensez donc à déclarer ces variables par des directives de compilation si vous êtes certain qu’elles ne seront utilisées que dans ces conditions. Prenons un exemple simple. Une fonction renvoyant une valeur aléatoire comprise entre deux bornes peut s’écrire : $0:=Modulo(Hasard;($2-$1+1))+$1 Elle renvoie toujours une valeur entière. Si cette fonction est écrite ainsi, le compilateur donnera à $0 le type Réel et non le type Entier ou Entier long. Il est donc préférable d’écrire cette méthode sous la forme : C_ENTIER LONG($0) Le paramètre rendu par la méthode sera plus petit et il sera donc plus rapide de faire appel à cette méthode. Prenons un autre exemple simple. Supposons que vous ayez déclaré deux variables en Entier long par l’instruction suivante : C_ENTIER LONG($var1;$var2) et qu’une troisième variable non typée reçoive la somme des deux autres : $var3:=$var1+$var2. Il vous faudra explicitement déclarer $var3 comme Entier long si vous voulez effectivement que $var3 soit de type Entier long, sinon le compilateur la typera par défaut en Réel. Note : Attention au mode de calcul dans 4D. En mode compilé, ce n’est pas le type de la variable recevant le calcul qui détermine le mode de calcul, mais le type des opérandes. Dans l’exemple ci-dessous, le calcul s’effectue sur des Entiers longs : C_REEL($var3) $var3 prendra la valeur –2147483648 en mode compilé comme en interprété. Dans l’exemple suivant : C_REEL($var3) pour des raisons d’optimisation, le compilateur considère la valeur 1 comme une valeur entière. $var3 prendra alors la valeur -2147483648 en mode compilé (car le calcul s’effectue sur des Entiers longs) et 2147483648 en mode interprété (car le calcul s’effectue sur des Réels). Les boutons sont un cas particulier de Réel qu’il est possible de déclarer en Entier long. Si vous souhaitez tester la valeur d’un caractère, il est plus rapide de faire la comparaison sur son Code de caractere que sur le caractère lui-même. En effet, la routine standard de comparaison de caractères prend en compte toutes les variations du caractère, comme par exemple les accentuations. Les traitements sur les tableaux à deux dimensions seront mieux gérés si la deuxième dimension est plus grande que la première. Par exemple, un tableau déclaré sous la forme : TABLEAU ENTIER(LeTableau;5;1000) sera mieux géré qu’un tableau déclaré sous la forme : TABLEAU ENTIER(LeTableau;1000;5) Vous gagnerez du temps lorsque, si vous devez effectuer plusieurs calculs sur un champ, vous rangez la valeur de ce champ dans une variable et que vous effectuez vos calculs sur cette variable, plutôt que de faire directement les calculs sur le champ. Illustrons notre propos par un exemple. Prenons la méthode suivante : Au cas ou La séquence ci-dessus sera plus lente à exécuter que si elle avait été écrite de la façon suivante : $Dest:=[Client]Dest De même que pour les champs, il est plus rapide de travailler sur une variable intermédiaire que sur un pointeur dépointé. Vous gagnerez énormément de temps si, lorsque vous devez faire plusieurs calculs sur une variable pointée, vous rangez le pointeur dépointé dans une variable. Vous disposez par exemple d’un pointeur pointant sur un champ ou sur une variable, MonPtr. Ensuite, vous souhaitez faire une série de tests sur la valeur pointée par MonPtr. Vous pouvez écrire : Au cas ou Il est plus rapide d’exécuter cette série de tests si elle est écrite ainsi : Temp:=MonPtr-> Utiliser des variables locales permet, dans bien des cas, de mieux structurer son code. Ces variables présentent d’autres avantages :
Voir aussi
Guide du typage
|
PROPRIÉTÉS
Produit : 4D
HISTORIQUE
UTILISATION DE L'ARTICLE
4D - Langage ( 4D v16) |