Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Réduire la taille du programme
Smashmaster Hors ligne Ancien modérateur Points: 4561 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




Louloux Hors ligne Ancien administrateur Points: 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.
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 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.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Alex_1186 Hors ligne Membre Points: 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..."
Cartix Hors ligne Membre Points: 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
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 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.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cartix Hors ligne Membre Points: 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
Therakou Hors ligne Membre Points: 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 !
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

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


Attention, ça ne fonctionne que pour les indexs de liste de 1 à 6 !
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cartix Hors ligne Membre Points: 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
Therakou Hors ligne Membre Points: 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 !
Cartix Hors ligne Membre Points: 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 ?)
Therakou Hors ligne Membre Points: 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 !
Cartix Hors ligne Membre Points: 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
Fabcvlr Hors ligne Membre Points: 2269 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 !
Mgl64200 Hors ligne Membre Points: 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 storm En ligne Labélisateur Points: 11631 Défis: 176 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
Mgl64200 Hors ligne Membre Points: 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 storm En ligne Labélisateur Points: 11631 Défis: 176 Message

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


Ben 1 octet par " enlevé
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Mgl64200 Hors ligne Membre Points: 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 storm En ligne Labélisateur Points: 11631 Défis: 176 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
Mgl64200 Hors ligne Membre Points: 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à...

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 111 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