Tous | Tutoriels du Mercredi | Basic Casio | C/C++/ASM | LuaFX | Graphisme | Transferts | Logiciels | Diverses astuces

Calculatrice
Toutes
Graphs 35 à 100
Graph 25
Graphs 75/85/95 (SD)
Graph 100(+)
Classpad 300/330 (+)
Fx-CG 10/20
Fx-CP 400
Graph 90+E

Retour à la liste des tutoriels
Tutoriel Casio : Optimiser son programme
Tutoriel rédigé le : 2012-04-15 17:08  par Smashmaster  Catégorie : Basic Casio  Calculatrice : Toutes

Discutez de ce tutoriel sur le forum >> Voir le sujet dédié (132 commentaires)

Optimiser son programme
Si vous programmez un jeu ou un programme il est important de l'optimiser au maximum au niveau taille et vitesse, voici de petites astuces pour optimiser vos programmes :

Le drawstat
Cliquez pour découvrir
Cliquez pour recouvrir
Le Drawstat est une méthode pour dessiner rapidement des trucs sur l'écran de la calculatrice, plus rapidement qu'avec des F-lines. voici des tuto pour apprendre le drawstat: Tuto de Dafp ou Tuto de neuronix

Optimiser les conditions
Cliquez pour découvrir
Cliquez pour recouvrir

Voici une condition avant l'optimisation :
If A>C
Then 3->B[DISP]
Else 8->B[DISP]
IfEnd

Et maintenant cette même condition après l'optimisation :
8-5(A>C)->B[DISP]

Littéralement: Si A>C, alors B vaut 8-5=3, sinon B vaut 8
En effet le chiffre cinq sera uniquement pris en compte dans le calcul si A>C.
Autres exemples pour mieux comprendre:

3->A
4->B
5->C
6->D

8(A>C)+5+3(A=<C)->E[DISP]       //si A>C, alors E=8+5=13, sinon E=5+3=8, dans ce cas A<C donc E=8

(6B/D+3)(A<C)+5+(10C/D+3)(Not A)->E[DISP]       //si A<C et A!=0 alors E=(6B/D+3)+5+(10C/D+3) ...


If J=1
Then Mat M[1,1]->A
Mat S[1,2]->B
Else
Mat M[2,2]->A
Mat S[2,3]->B
IfEnd

s'écrit aussi :

Mat M[2,2](J!=1)+Mat M[1,1](J=1)->A
Mat S[2,3](J!=1)+Mat S[1,2](J=1)->B


Les vitesses d’exécutions :
For 1->A To 2000
If A>C
Then 5->C
Else 3->C
IfEnd
Next

//Vitesse sur la prizm underclocké à 54.4 Mhz : 9.31s
//Vitesse sur la G75 : 8.3s
For 1->A To 2000
3+2 (A>C->C
Next

//Vitesse sur la prizm underclocké à 54.4 Mhz : 7.84s
//Vitesse sur la G75 : 8.46s

Sur la G75 cette astuce est plus lente, mais elle est plus rapide sur la prizm (cg10/20).

Les sous programmes
Cliquez pour découvrir
Cliquez pour recouvrir
Imaginons un gros programme qui contient plusieurs fois des répétitions, exemple :

[u]nom du programme: MENU[/u]
...
// Truc 1
...
Do
Getkey
LpWhile Not Ans
...
// Truc 2
...
Do
Getkey
LpWhile Not Ans
...
// Truc 3
...
Do
Getkey
LpWhile Not Ans
// truc 4
...
On observe qu'il y a des répétitions.
On peut optimiser ce programme en mettant la partie répétée dans un sous prog, on obtient ceci :

[u]nom du programme: MENU[/u]
...
// Truc 1
...
Prog "GETKEY"
...
// Truc 2
...
prog "GETKEY"
...
// Truc 3
...
prog "GETKEY"
...
// truc 4
...

[u]nom du programme: GETKEY[/u]

Do
Getkey
LpWhile Not Ans
Les sous prog améliore aussi la lisibilité du code

Utiliser des variables
Cliquez pour découvrir
Cliquez pour recouvrir
Voici un programme avant l'optimisation :
{2565166,2565166,2565166,2565166,2565166,2565166,1451,1546,
444,2565166,2565166,2565166,2565166,2565166->List 1

Et maintenant ce même programme après l'optimisation :
[u]Premier possibilité :[/u]
2565166->A
{A,A,A,A,A,A,1451,1546,444,A,A,A,A,A->List 1


[u]Deuxième possibilité :[/u]
2565166
{Ans,Ans,Ans,Ans,Ans,Ans,1451,1546,444,Ans,Ans,Ans,Ans,Ans->List 1

Remarque 1 : Dans ce cas les '}' sont inutiles
Remarque 2 : Ans est une variable qui contient la valeur du dernier résultat, ici Ans vaut 2565166
J'ai tout simplement stocké le nombre 2565166 dans la variable A ;). Une autre possibilité est d'utiliser la variable Ans qui permet d'optimisé encore mieux vos programmes
Autres exemples :


[u]Avant :[/u]

(Mat S[1,4]+AxMat S[1,4])xMat S[1,4]->E

[u]Après :[/u]

Mat S[1,4]->B
(B+AB)B->E
ou encore (avec Ans) :
Mat S[1,4]
(Ans+AxAns)Ans

Do
Getkey=31=>1->A
Getkey=41=>2->A
Getkey=51=>3->A
Getkey=61=>4->A
Getkey=71=>5->A
Getkey=32=>6->A
Getkey=42=>7->A
Getkey=52=>8->A
(89 octets)

devient

Do
Getkey
Ans=31=>1->A
Ans=41=>2->A
Ans=51=>3->A
Ans=61=>4->A
Ans=71=>5->A
Ans=32=>6->A
Ans=42=>7->A
Ans=52=>8->A  
(67 octets)


Combien de variables existe-t-il ? Beaucoup de personnes pensent qu'il y en a 28 (Toutes les lettres de l'alphabet, r et [TETA] ), mais en réalité il y en a 37 (peut être même plus) :
Les variables supplémentaires sont a0, a1, a2, b0, b1, b2, c0, c1 et c2, on les trouve dans [VARS]+[F6]+[F2]+[2] pour les Graph 100 (+) ou dans [VARS]+[F6]+2x[F2] pour les autres calculatrices

Dans cette partie du cours on admettra ceci : une variable existe si elle ne vaut pas 0 et une variable n'existe pas si elle vaut 0. Exemple : soit une variable A, la variable A existe si A != 0 et elle n'existe pas si A=0
Voici un programme avant l'optimisation :

If A!=0
Then ...
IfEnd
If B=0
Then ...
IfEnd

Et maintenant ce même prog après l'optimisation :

If A
Then ...
IfEnd
If Not B
Then ...
IfEnd    

La première ligne signifie ''Si A existe'' c'est-à-dire ''Si A !=0''
La quatrième ligne signifie ''Si B n'existe pas'' c'est-à- dire ''Si B = 0''

Syntaxe globale :
''<variable> = 0'' s'écrit aussi ''Not <variable>'' (optimisation de 1 octet, c'est déjà pas mal)
''<variable> != 0'' s'écrit aussi ''<variable>'' (optimisation de 2 octets)
On peut aussi appliquer cette méthode dans les boucles, exemple :

Do
...
LpWhile A=0 And B!=0

donne:

Do
...
LpWhile Not A And B     (optimisation de 3 octets)

Eviter les goto/Lbl
Cliquez pour découvrir
Cliquez pour recouvrir
Les Labels (c'est-à-dire les Goto/Lbl) sont très utilisés en programmation mais malheureusement les labels ont deux gros défauts :
Ils sont lent:

0->A
Lbl 1
A+1->A
A<1000=> Goto 1  ce programme est exécuté en 12,5 secondes

0->A
Do
A+1->A
LpWhile A<1000     ce programme est exécuté en 11,1 secondes

Dans cet exemple il n'y a pas beaucoup de différence au niveau de la vitesse, mais dans un gros programme la lenteur est bien plus marquée
Ils bug si on les utilise mal:
Exemple de programme qui bug:
1->A
If A=1
Then Lbl 1
...
'truc 1
...
IfEnd
...
'truc 2
...
5->B
B=5=>Goto 1

Il y a un Syn Err au niveau du IfEnd, pourquoi ?
Ce programme bug, car un moment donné la calculatrice rencontre deux IfEnds et un If+Then donc la calculatrice pense qu'il y a un IfEnd en trop, d'où le bug ... En gros la calculatrice lit :
1->A
If A=1
Then Lbl 1
...
'truc 1
...
IfEnd
...
'truc 2
...
5->B  
la calculatrice lis B=5=>Goto 1 or B=5 donc elle cherche Lbl 1
...
'truc 1
...
IfEnd
la calculatrice n'ignore pas le IfEnd

Il est assez difficile de corriger ces bug parce que l'erreur n'est pas très visible, d'où la nécessité d'utiliser moins de labels

Comment contourner ces problèmes ? Tout simplement en utilisant moins de labels et plus de boucles (boucle For, Do-LpWhile, While ...), le mieux c'est de ne plus utiliser de label
Remarque : les labels (c'est-à-dire les Goto/Lbl) ne sont pas des boucles !

Les petites optimisations
Cliquez pour découvrir
Cliquez pour recouvrir
Voici des optimisations qui ne modifient pas grand-chose la taille du prog, mais qui peuvent être utiles.

0.6+0.4A+0.2B->E s'écrit aussi .6+.4A+.2B->E ,dans ce cas les zéros sont inutiles, la calculatrice comprend que 0.6 = .6

5(2A(3+A(4-A(5-A(A+B+C+D)))))->E s'écrit aussi 5(2A(3+A(4-A(5-A(A+B+C+D->E , dans ce cas les parenthèses ')' à la fin ne servent à rien

1/A s'écrit aussi A^-1, pour obtenir ^-1 il suffit d'appuyer respectivement sur les touches [shift] puis [)].

5000000000000 s'écrit aussi 5*10^12 ou encore 5E12, pour obtenir le 'E' il suffit d'appuyer sur la touche [x10^x], cette touche se trouve en bas de la calculatrice
autre exemple: 0.000000000005 = 5E-12
Attention : 100000A ne s'écrit pas AE5 (Erreur syntaxe), dans ce cas il faut écrire Ax1E5

Pour tout ce qui est puissances de 10, il y a aussi le menu ESYM ( [OPTN][F5][5] sur la g100(+) et [OPTN] [F6] [F6] [F1] sur les autres modèles) qui contient les symboles milli, micro, nano, pico, femto, kilo, mega, giga, tera, péta.
On peut par exemple écrire 1k pour avoir 1000, 5T pour avoir 5x10^12 ...

{500,501,502->List 1 s'écrit aussi 500+{0,1,2->List 1, dans cet exemple chaque valeur de la List 1 est additionné par 500
Bien évidemment on n'est pas obligé d'utiliser des +, on peut très bien utilisé les autres signes mathématiques

Liens intéressants:


Quelques exercices d'optimisation

Exercices
Exercices

Optimiser ce programme :

Filename: BIDULE

{100000000,200000000,300000000,400000000,500000000,600000000,
700000000,800000000,900000000,1000000000}->List 1
{25,5651,505,1,561,65,165,51,52,651,5}->List 2
0->A
Do
Getkey=31=>1->A
Getkey=41=>2->A
Getkey=51=>3->A
Getkey=61=>4->A
Getkey=71=>5->A
LpWhile A=0
3->C
If A<C
Then 8->D
Else 5->D
IfEnd
D[DISP]
Text 1,1,"SALUT"
Do
Getkey
LpWhile Ans=0
Cls
Text 1,1,"JE SUIS SMASHMASTER"
Do
Getkey
LpWhile Ans=0
Cls
Text 1,1,"JE SUIS MEMBRE DEPUIS 2009"
Do
Getkey
LpWhile Ans=0
Cls
Text 1,1,"J'AIME PC "
Do
Getkey
LpWhile Ans=0
Cls
Drawstat


Solution:
Il existe plusieurs méthodes pour optimiser ce code, voici en une:

Filename: BIDULE
1E8x{1,2,3,4,5,6,7,8,9,10->List 1
{25,5651,505,1,561,65,165,51,52,651,5->List 2
Prog \"GETKEY\"
Int .1Ans-2->A
5+3(A<3->D
D[DISP]
Text 1,1,\"SALUT\"
Prog \"GETKEY\"
Text 1,1,\"JE SUIS SMASHMASTER\"
Prog \"GETKEY\"
Text 1,1,\"JE SUIS MEMBRE DEPUIS 2009\"
Prog \"GETKEY\"
Text 1,1,\"J\'AIME PC \"
Prog \"GETKEY\"
Drawstat

Filename : GETKEY

Do
Getkey
LpWhile Not Ans
Cls


Discutez de ce tutoriel sur le forum >> Voir le sujet dédié (132 commentaires)

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 17 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd