[Axe] Optimisation d'un code pour la compilation !
4 participants
Page 1 sur 1
[Axe] Optimisation d'un code pour la compilation !
Amateurs de l'Axe Parser, bienvenue à vous. :cheers:
Ce post n'est qu'une pâle traduction des informations qu'a réuni squidgetx dans son post sur omnimaga.
Son but est de réunir toutes les optimisations de code possibles, d'étudier leur tailles et leur vitesses d'exécution.
Et pour finir, une citation de Quigibo que je n'ai pas osé traduire, mais que vous devriez comprendre :
Happy coding !
Ce post n'est qu'une pâle traduction des informations qu'a réuni squidgetx dans son post sur omnimaga.
Son but est de réunir toutes les optimisations de code possibles, d'étudier leur tailles et leur vitesses d'exécution.
Si vous n'avez pas envie de tout lire, j'ai mis des balises codes afin de repérer plus rapidement les codes à optimiser. Dans tout mes exemples, j'utiliserai la variable A. Bien entendu vous pouvez faire ces optimisations avec n'importe quelles autres variables.
Partie I : les trucs basic
Quelques astuces que nous avons appris en TI-Basic peuvent être également appliquées à Axe. Jetons un coup d'oeil:
Les opérations booléennes comme celle-ci :Peuvent être optimisées comme ceci :
- Code:
If A≠0
Mieux encore, le calcul If (A≠0) and (B≠0) se simplifie donc par If A and B.
- Code:
!If A
Toutefois, il faut faire attention : les calculs en Axe se font sans règles de priorités. Le calcul If A=1 and B=2 sera lu par la calculatrice If (A=1 and B)=2. Ce calcul étant toujours égal à 0, le code de la condition ne sera jamais exécuté. Pour remédier à cela, il faut placer les parenthèses avant le deuxième calcul booléen : If A=1 and (B=2.
Partie II : Général
Vérifier l'égalité :s'optimise en
- Code:
If A=EXP
- Code:
!If A-EXP
De même ques'optimise en
- Code:
If A=EXP and (B=EXP)
Où + est le comparateur 'or' pour les variables de 2 octets.
- Code:
!If A-EXP + (B-EXP)
Maintenant, si vous vérifiez la même variable par plusieurs expression :on simplifiera par
- Code:
If A=EXP1 or (A=EXP2)
Il ne faudra surtout pas oublier le 0 à la fin, où sinon la commande inData( ne se terminera jamais. Les points faibles de ce code sont que les valeurs testées sont forcément des constantes d'un octet chacune.
- Code:
If inData(A,Data(EXP1,EXP2,0))
Truc de math
Si vous le pouvez, mettez toujours les constantes à la fin d'une expression :ce code peut être simplifié comme ceci :
- Code:
CONST+A
En effet, il est plus rapide d'additionner deux octets à un octet voir à un bit, que l'inverse. La différence est faible, mais peut être utile.
- Code:
A+CONST
Autre chose : mettez le moins de parenthèses dans vos code, et utilisez les calculs sans priorités à votre avantage.
Partie III : utilisez la variable Ans
Comme en TI-Basic, l'Axe possède une variable Ans possédant régulièrement la valeur du dernier calcul effectué. Si on ne la réinitialise pas en début d'expression par un nombre ou une variable, on peut l'utiliser très facilement. Tout les calculs passent par Ans.
Par exemple, si on utilise deux fois le même argument :On peut simplifier en
- Code:
Text(0,0,PTR)
Le deuxième 0 disparaît car il n'est plus utile : la variable Ans possède la même valeur.
- Code:
Text(0,,PTR)
A partir de cela, on peut améliorer grandement la vitesse de nos programmes, en combinant les calculs booléen à la variable Ans :devient
- Code:
If A>3:1→B
- Code:
If A>3:→B
Ou encore :devient
- Code:
0→B: 0→A
- Code:
0→B→A
Et même :devient
- Code:
0→A: 1→B: 3→C
- Code:
0→A+1→B+2→C
On peut également utiliser le même système dans les fonctions :devient
- Code:
sub(LBL,EXP).....Lbl LBL: EXP*2→{L1}
- Code:
sub(LBL,EXP).....Lbl LBL: *2→{L1}
Si l'on veut exécuter une boucle un nombre n de fois :
- Code:
n
While
-1→A
:.Code
A
End
On peut également recréer une boucle Do...While (pour les connaisseurs) à l'aide d'un Lbl, rendant la boucle encore plus rapide :
- Code:
n
Lbl L
→A
;Code
!If A-1
Goto L
End
Bien sûr, on ne peut pas parler de toutes les optimisations possible avec la variable Ans, mais je suis sûr que vous en trouverez d'autres.
Partie IV : fonctions
C'est avec les fonctions que vous réduirez le plus la taille de votre code. Elles sont très facile à utiliser ; il faut juste savoir quand les utilisez :
- Si vous réécrivez un même code plusieurs fois dans votre programme, faites une fonction !
- Ou sinon, si votre code n'apparaît qu'une fois, n'en faites pas.
Les commandes sub( prennent entre 3 et 5 octets sur votre programme, en fonction de la longueur de son nom. Il faut rajouter 3 octets à chaque argument que vous mettez sub(LBL,ARGUMENT,ARGUMENT,...) (6 maximum). A chaque fois que vous mettrez un argument sauvé (sub(LBL,ARGr,...)), cela vous coûtera 15 octets par arguments en plus.
Si vous faites appelle à une fonction dans une fonction, et que vous mettez un Return juste après comme ici :Il sera judicieux d'utiliser la commande Goto :
- Code:
Lbl A
:.Code
:sub(B)
:ReturnLe Return de l'autre fonction effectuant un retour vers le programme principale.
- Code:
Lbl A
:.Code
:Goto B
Un autre truc, si vous mettez en fin de programme une fonction quelconque :La fin du programme étant lui même un Return, on peut simplifier comme cela :
- Code:
Lbl A
:.Code
:Return
- Code:
Lbl A
:.Code
Partie V: La vitesse ou la taille
Les optimisations qui vont suivre permettent toutes de rendre le programme plus rapide, au détriment de la taille du programme.
Mettre le plus de condition possible augmente la vitesse considérablement :est plus lent que
- Code:
If EXP1 and EXP2
Cependant, le deuxième code prend plus de mémoire sur l'exécutable.
- Code:
If EXP1 : If EXP2
Lors de simple calcul, on peut gagner de la vitesse en multipliant par les puissances de 2 les plus petites.Le code ci dessus prend moins de place, mais est plus lent que le code ci dessous.
- Code:
EXP*96
- Code:
EXP*2*2*2*2*2*3
Partie VI : divers
Toutes les choses qui n'appartiennent à aucune catégorie...
Si vous avez besoin de faire des lignes horizontales ou verticales :Il est mieux de créer un rectangle d'épaisseur 1 :
- Code:
Line(0,,20,0)
Cela améliore la vitesse et la taille je crois.
- Code:
Rect(0,,20,1)
Utilisez les ElseIf et les DS <( si vous le pouvez. Ils ne sont pas là pour rien, et ils sont très utiles.
Les commandes text( et Bitmap( sont lentes parce ce sont des fonctions de TI. Evitez-les si possible. (je sais, il est difficile de ne pas utiliser de text(... mais faites de votre mieux)
La nouvelle commande DispGraphClrDraw revient à la même chose que DispGraph: ClrDraw, mais en deux fois plus vite.
Rappelez-vous chaque nouvelle commande que vous utilisez en Axe créée ses propres fonctions dans votre exécutable. Ainsi, (pour des raisons de taille) il est mieux d'éviter d'utiliser Rect( si vous avez déjà utilisé la commande line( de même pour la commande Pt-On( si vous avez déjà utilisé Pt-Change(.
Et pour finir, une citation de Quigibo que je n'ai pas osé traduire, mais que vous devriez comprendre :
One major optimization that usually gets ignored is recycling large axe commands. Axe is not like BASIC and so each command needs its own subroutine to add to your program. For instance, lets say you use Pt-On() and Pt-Mask() in your code. Each one has to bring its own 100+ byte subroutine into your program. But you can probably get away with having just a Pt-Mask routine, recycling it to act like Pt-On by simply adding a 2nd layer to your sprite which is only 8 bytes extra instead of 100ish. Or you could do the opposite too and only have Pt-On() and Pt-Change() to manually change both buffers at once. This generally reduces the overall size of the program by a lot when you use the routines only once or very rarely in your code. And I don't mean calling it rarely, it could be the most used routine in your code, I just mean rarely appears in your source.
Happy coding !
Dernière édition par kindermoumoute le Ven 31 Déc - 11:14, édité 1 fois
kindermoumoute- Or 4
- Sexe :
Age : 30
Messages : 797
Date d'inscription : 07/10/2010
Points Forum : 21
Points Concours : 1
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-83+
Re: [Axe] Optimisation d'un code pour la compilation !
kindermoumoute a écrit:Mieux encore, le calcul If (A≠0) and (B≠0) se simplifie donc par !If A and B.
pourquoi le point d'exclamation?
If (A≠0) and (B≠0) se simplifie en If A and B et c'est tout.
ensuite, c'est surement bien mais je ne sais pas utiliser à peu près toutes les fonctions dont tu parles.
persalteas- Platinum 2
- Sexe :
Age : 28
Messages : 2068
Date d'inscription : 30/06/2010
Etudes : PACES (médecine)
Points Forum : 114
Points Concours : 10
Langages :- - TI-Basic Z80
- - xLib
- - Grammer
- - TI-Basic Nspire
- - TI-82 Stats.fr
- - TI-83
- - TI-83+
- - TI-84+ SE
- - TI-86
- - TI-Nspire
- - TI-Nspire CX
- - Casio Collège
- - Casio Graph
Re: [Axe] Optimisation d'un code pour la compilation !
Exacte, tenez moi au courant de toutes les erreurs que j'ai fait.
kindermoumoute- Or 4
- Sexe :
Age : 30
Messages : 797
Date d'inscription : 07/10/2010
Points Forum : 21
Points Concours : 1
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-83+
Re: [Axe] Optimisation d'un code pour la compilation !
C'est très pratique merci, maintenant je comprend pour certains trucs ne fonctionnaient pas.
Re: [Axe] Optimisation d'un code pour la compilation !
Cool j'en apprend pas mal à propos des Ans et de l'optimisation de la vitesse.
Metallica- Or 4
- Sexe :
Age : 28
Messages : 926
Date d'inscription : 30/06/2010
Etudes : DUT Info
Points Forum : 17
Points Concours : 9
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-82 Stats.fr
- - TI-83+ SE
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|