« Initiation au Lua avec Scribunto/Gestion de l'environnement » : différence entre les versions

Contenu supprimé Contenu ajouté
rédaction
rédaction
Ligne 103 :
== Rapidité d'exécution d'un programme ==
 
En informatique, un programme, bien qu'il s'exécute correctement, peut ne pas donner entièrement satisfaction carsi son exécution ne se fait pas assez rapidement. Nous n'avons pas évoqué le problème jusqu'à maintenant, mais le programmeur doit garder présent à l'esprit que son programme doit s'exécuter le plus rapidement possible pour éviter de trop monopoliser la machine qui exécute son programme. Bien souvent, pour exécuter une tache particulière, plusieurs solutions s'offreoffrent à nous. Nous devons alors choisir, parmi toute les solutions possibles, celle dont le temps d’exécution sera le plus bref possible. Prenons un exemple :
 
Supposons que nous voulions écrire une fonction qui nous renvoie la valeur du polynôme p(x) = 7x<sup>4</sup>+5x<sup>3</sup>+3x<sup>2</sup>+x+2. Une première façon d'écrire cette fonction pourrait être :
 
<syntaxhighlight lang="lua">
 
local p = {}
 
function p.poly(frame)
return 7*frame.args[1]^4+5*frame.args[1]^3+3*frame.args[1]^2+frame.args[1]+2
end
 
return p
 
</syntaxhighlight>
 
Cette façon d'écrire le programme, bien que fonctionnant parfaitement, n'est pas correcte. Pourquoi ?
 
En fait, lorsqu'on écrit '''frame.args[1]''', on fait appel à la valeur de x que nous a fourni l'utilisateur dans la commande #invoke et qui est donc quelque chose d'extérieur au programme. Allez chercher cette valeur met en oeuvre des routines qui sont, à elles seules, des programmes qu'il faut appeler et exécuter. tout cela demande du temps. On comprend donc aisément qu'écrire quatre fois '''frame.args[1]''' va demander un temps d'exécution plus long que si l'on ne l'écrivait qu'une seule fois. Il est donc bien préférable d'écrire la fonction en s'arrangeant pour n'avoir qu'une seule exécution de '''frame.args[1]'''. À la première façon d'écrire le programme, nous préférerons donc la deuxième façon suivante :
 
<syntaxhighlight lang="lua">
 
local p = {}
 
function p.poly(frame)
local x = frame.args[1]
return 7*x^4+5*x^3+3*x^2+x+2
end
 
return p
 
</syntaxhighlight>
 
On pourrait, à ce niveau, être satisfait, de notre programme et penser que l'on a la meilleure façon possible de l'écrire. En fait, il n'en est rien ! Il est encore possible d'améliorer le temps d'exécution de la fonction '''p.poly'''. Cette façon d'écrire un polynôme, en informatique, n'est pas correcte. Si nous comptons les multiplications et les additions, nous voyons qu'il y a 9 multiplications et 4 additions. Peut-on imaginer une façon d'écrire un polynôme de façon à réduire le nombre d'opérations. Cela est possible en remarquant, tout simplement, que :
 
<math>7x^4+5x^3+3x^2+x+2 = x(7x^3+5x^2+3x+1)+2 = x(x(7x^2+5x+3)+1)+2 = x(x(x(7x+5)+3)+1)+2</math>
 
Si nous comptons le nombre de multiplication et d'addition dans l'expression x(x(x(7x+5)+3)+1)+2, nous voyons qu'il y a 4 multiplications et 4 additions. Nous avons 5 multiplications de moins à faire dans la calcul de x(x(x(7x+5)+3)+1)+2 que dans la calcul de 7x<sup>4</sup>+5x<sup>3</sup>+3x<sup>2</sup>+x+2, d'où le gain de temps. Nous pouvons donc améliorer encore le temps d'exécution de la fonction '''p.poly''' en l'écrivant :
 
<syntaxhighlight lang="lua">
 
local p = {}
 
function p.poly(frame)
local x = frame.args[1]
return (((7*x+5)*x+3)*x+2)*x+1
end
 
return p
 
</syntaxhighlight>
 
Nous pouvons ainsi espérer avoir la meilleure façon possible d'écrire notre fonction !
 
Supposons que nous voulions écrire une fonction
 
== Comment utiliser des fonctions écrites dans un autre module ==