Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Réduire la taille du programme
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Réduire la taille du programme

Posté le 25/05/2011 22:12

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




Pages : Précédente1, 2, 3Suivante
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 30/06/2012 18:26 | #


Oui mais moi je me suis amusé à écrire un code qui détaille les opérations avec une mise en forme adaptée et qui scrolle quand t'appuies sur EXE. Et le but n'est pas de coder un truc utile mais de se former.
LephenixnoirHors ligneAdministrateurPoints: 14121 Défis: 136 Message

Citer : Posté le 05/06/2014 16:25 | #


Petit déterrage (quoique, mieux vaut que ce topic ne tombe pas dans l'oubli ) pour dire qu'il existe des raccourcis pour File, VarList et List qui donnent dans la taille en octets d'un élément "List " ou "File " une donnée complète du style "List1" ou "File3". Par exemple :
List 1[2] // 2+4 = 6 octets
List1[2]  // 2+3 = 5 octets

Les valeurs vont de 1 à 6.
C'est presque rien, mais c'est déjà ça.
Alex_1186Hors ligneMembrePoints: 1215 Défis: 46 Message

Citer : Posté le 05/06/2014 16:44 | #


Ah pas mal!
C'est une vieille fonction qui date des vieilles Graph 25...
En fouillant l'autre fois dans absolument tous les menus j'avais trouvé des trucs sortis d'outre-tombe, comme ça par exemple!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 05/06/2014 17:13 | #


Raccourcis introuvables sur G100+

Ajouté le 05/06/2014 à 17:14 :
Et tnat que j'y suis, le lien Optimiser les GETKEY est mort
LephenixnoirHors ligneAdministrateurPoints: 14121 Défis: 136 Message

Citer : Posté le 05/06/2014 17:14 | #


Ah oui, peut-être. Je les ai trouvés au fin fond du catalogue, tout en bas après les symboles.
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 05/06/2014 17:18 | #


Sur G100+, le catalogue est sous forme de menu comme le menu démarer de windows, et on a rien après les symboles
TherakouHors ligneMembrePoints: 195 Défis: 23 Message

Citer : Posté le 05/06/2014 17:33 | #


Lephenixnoir a écrit :
C'est presque rien, mais c'est déjà ça.

Sur des fonctions aussi courantes que les "List" (après ça dépend du programme), ça me paraît énorme. Je vais remplacer tout ça et je vous communiquerai les gains de mémoire.
Prêt à sauver le monde des Pokémons de la malédiction du cercle ?
Cliquer pour enrouler
Venez découvrir Pokémon en basic et affrontez la menace qui plane sur la région !
LephenixnoirHors ligneAdministrateurPoints: 14121 Défis: 136 Message

Citer : Posté le 05/06/2014 17:37 | #


Attention, ça ne fonctionne que pour les indexs de liste de 1 à 6 !
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 05/06/2014 17:39 | #


Therakou a écrit :
Sur des fonctions aussi courantes que les "List" (après ça dépend du programme), ça me paraît énorme. Je vais remplacer tout ça et je vous communiquerai les gains de mémoire.

Ne t'emballe quand même pas, tu gagne juste un octet à chaque fois
TherakouHors ligneMembrePoints: 195 Défis: 23 Message

Citer : Posté le 05/06/2014 17:43 | #


@Lephenixnoir Oui j'ai bien compris.

@Cartix Sur mon jeu, les listes sont la base du programme. Admettons que j'utilise 200 fois les listes comprises entre 1 et 6, là ça fait un changement.

(J'avais oublié que j'utilisais généralement une variable pour les numéros de liste. Inutile pour moi donc. )

Ajouté le 05/06/2014 à 17:56 :
J'ai tout de même économisé 108 octets. Non négligeable.
Prêt à sauver le monde des Pokémons de la malédiction du cercle ?
Cliquer pour enrouler
Venez découvrir Pokémon en basic et affrontez la menace qui plane sur la région !
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 05/06/2014 17:58 | #


Non maisz je sais que c'est pas inutile, mais ça reste pas grand chose (Ton programme, il en fait combien au total ?)
TherakouHors ligneMembrePoints: 195 Défis: 23 Message

Citer : Posté le 05/06/2014 18:03 | #


Je suis très attaché à l'économie de mémoire.
Quand je peux grappiller deux octets je suis heureux, alors imagine 108...
Sans les matrices, pictures et listes, il pèse 37 044 octets.
Prêt à sauver le monde des Pokémons de la malédiction du cercle ?
Cliquer pour enrouler
Venez découvrir Pokémon en basic et affrontez la menace qui plane sur la région !
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 05/06/2014 18:09 | #


Therakou a écrit :
Quand je peux grappiller deux octets je suis heureux, alors imagine 108...
Sans les matrices, pictures et listes, il pèse 37 044 octets.
Oui, je comprends parfaitement, mais tu avouera que comparé à la taille du programme c'est pas énorme (mais c'est toujours ça, je suis d'accord )

Ajouté le 05/06/2014 à 18:13 :
Par contre, ça permet de faire tenir certain calcul sur une seule ligne, dont c'est plus beau
FabcvlrHors ligneMembrePoints: 2031 Défis: 41 Message

Citer : Posté le 30/03/2015 11:25 | #


Je ne l'ai pas vu dans ce post et comme je l'ai trouvé par hasard suite à une "non erreur" qui m'a étonnée ; il n'est pas nécessaire de fermer le second guillemet avec la fonction Text ! sauf si vous avez placé un Disp "◢" à la fin !
L'expérience des autres, c'est comme une chandelle que l'on tient allumée dans son dos par une nuit de tempête !
Mgl64200Hors ligneMembrePoints: 649 Défis: 0 Message

Citer : Posté le 30/03/2015 11:27 | #


Oui j'avais vu ça aussi ça m'a étonné que ça plante pas, mais après, il considère que tout le retse et du texte du coup ça plante à un moment
Toi t'es en train de lire ma signature là...
Dark stormHors ligneMembre d'honneurPoints: 10765 Défis: 174 Message

Citer : Posté le 30/03/2015 12:13 | #


Ben, ça marche aussi avec les locate
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Mgl64200Hors ligneMembrePoints: 649 Défis: 0 Message

Citer : Posté le 30/03/2015 12:15 | #


Et ça fait faire des gains de mémoire ?
Toi t'es en train de lire ma signature là...
Dark stormHors ligneMembre d'honneurPoints: 10765 Défis: 174 Message

Citer : Posté le 30/03/2015 12:28 | #


Ben 1 octet par " enlevé
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Mgl64200Hors ligneMembrePoints: 649 Défis: 0 Message

Citer : Posté le 30/03/2015 12:31 | #


pas grand chse quoi
Toi t'es en train de lire ma signature là...
Dark stormHors ligneMembre d'honneurPoints: 10765 Défis: 174 Message

Citer : Posté le 30/03/2015 12:34 | #


C'est à force de pas grand chose que tu économise de la place
Mais oui, cette astuce seule n'est pas très significative.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Mgl64200Hors ligneMembrePoints: 649 Défis: 0 Message

Citer : Posté le 30/03/2015 12:41 | #


Oi c'est ce que je dis si tu fais toutes les optis, le gain est déja assz conséquent, la technique seule ne suffit pas
Toi t'es en train de lire ma signature là...
Pages : Précédente1, 2, 3Suivante

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

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd