Seuls les membres ayant 30 points peuvent parler sur le chat.

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 : 1, 2, 3Suivante
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 28/05/2012 11:39 | #


Dans une boucle :
If A>C Then
5->A
Else
3->A
Ifend

est plus lent que
3+2(A>C->A



Ajouté le 28/05/2012 à 11:43 :
Edit : je peux recopier une partie de ton tuto pour en faire un pour la classpad sur casio-scene ?
Merci d\'avance

Ajouté le 28/05/2012 à 11:51 :
Edit2 : Il y a encore moyen d\'optimiser ton prog :
Cliquez pour découvrir
Cliquez pour recouvrir
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[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

SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 28/05/2012 12:45 | #


Sur ma G65
3+2(A>C->A
est plus lent que
If A>C Then
5->A
Else
3->A
Ifend
Je vais tester si c'est aussi le cas sur les autres calulatrices

Edit : je peux recopier une partie de ton tuto pour en faire un pour la classpad sur casio-scene ?
Merci d'avance
Pas de problème :).

Edit2 : Il y a encore moyen d'optimiser ton prog :
Merci, je vais modifié ça :).
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 28/05/2012 12:50 | #


Ok. Merci pour le test, et pour l'autorisation de ré-utilisation
Par contre, va falloir que j'ajoute pas mal de trucs qui ne sont pas présent sur les autres calculatrices (elseif, switch, ...)
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 28/05/2012 13:05 | #


édit

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


CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 28/05/2012 13:18 | #


Ok. Merci
Ps : tu peux rajouter ces test dans le spoiler des conditions
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 28/05/2012 13:24 | #


De rien, j'ai rajouté ces test dans le spoiler ;).

Ajouté le 28/05/2012 à 13:25 :
C\'est assez bizarre, cette astuce est bien plus rapide sur la prizm, mais pas sur les autres calculatrices.
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 28/05/2012 13:38 | #


et sur la classpad, cette astuce ne fonctionne pas

Ajouté le 28/05/2012 à 13:42 :
edit : pour les listes : e8{1,2,3->List 1 ne marche pas ? Parce sur classpad, il ne faut ni le \'\'1\'\', ni le \'\'x\'\'
Dark stormHors ligneMembre d'honneurPoints: 10832 Défis: 176 Message

Citer : Posté le 28/05/2012 20:26 | #


pour les variables, je vient de voir qqu chose: en plus des variables traditionnelles, a0, a1 etc comprises, il y a le "X" utilisé dans les fonctions, ainsi que le "Theta" si vous modifiez les réglages de la calto avant d'éditer vos programmes => vous utilisez "X", puis changez le mode de graphique en polaire, et utilisez le "theta".
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 28/05/2012 21:05 | #


pour les listes : e8{1,2,3List 1 ne marche pas ?
Cette astuce fonctionne sur tous les calculatrices que j'ai pu tester (g65/75/85/100+/cg20)
Parce sur classpad, il ne faut ni le ''1'', ni le ''x''
Je ne comprend pas trop, c'est quoi "x"et "1"?
Alp96Hors ligneMembrePoints: 239 Défis: 3 Message

Citer : Posté le 30/05/2012 14:29 | #


génial ce tuto! mon optimisation de code va s'en retrouver améliorée !!
Alp96, celui qui programme n'importe quoi pourvu que ce soit inventif!!! :demon:
Calcu: graph 35+ tweaké
Transformez votre graph 35+ SH4 en graph 75!
C'est par ici!
Mes progs#Cliquez!!
Cliquez pour recouvrir

Etes vous un vrai trader???
Business

Saurez vous vaincre les puissances ennemis?
Swords and Sandals 2

Un 2048 ca vous tente??
2048
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 29/06/2012 15:34 | #


Petite astuce qui peut aider quelque un d'entre vous :
On a un menu avec un curseur '=>'
1->A
Locate 3,1,"CHOIX 1" [green]//on affiche le menu avec les choix[/green]
Locate 3,2,"CHOIX 2"
Locate 3,3,"CHOIX 3"
Do
Locate 1,A,"=>" [green] //On affiche le curseur[/green]
Getkey->G
G=28=>A-1->A  [green] //si on appuie sur la touche du haut alors le curseur monte[/green]
G=37=>A+1->A [green] //si on appuie sur la touche du bas alors le curseur descend[/green]
A>3=>1->A  [green] //si le curseur descend trop bas alors on le place en haut de l'écran  (au niveau de "CHOIX 1")[/green]
A<1=>3->A  [green] //si le cuseur monte trop haut (ou sort de l'écran) alors on le place au niveau de "CHOIX 3"[/green]
LpWhile G!=31

A>3=>1->A : A<1=>3->A est un peu long, on peut optimiser ça par 1+MOD(A-1,3->A

1->A
Locate 3,1,"CHOIX 1"[green]  //on affiche le menu avec les choix[/green]
Locate 3,2,"CHOIX 2"
Locate 3,3,"CHOIX 3"
Do
Locate 1,A,"=>" [green]  //On affiche le curseur[/green]
Getkey->G
G=28=>A-1->A [green]  //si on appuie sur la touche du haut alors le curseur monte[/green]
G=37=>A+1->A [green] //si on appuie sur la touche du bas alors le curseur descend[/green]
1+MOD(A-1,3->A  
LpWhile G!=31

Syntaxe : Min+MOD(PositionDuCurseur-Min,Max-(Min-1)->PositionDuCurseur
DodormeurHors ligneAncien rédacteurPoints: 3928 Défis: 82 Message

Citer : Posté le 29/06/2012 15:39 | #


ca fait quoi la commande MOD?
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 29/06/2012 15:44 | #


La commande MOD donne le reste de la division euclidienne entre deux nombres
Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
SmashmasterHors ligneAncien modérateurPoints: 4559 Défis: 253 Message

Citer : Posté le 29/06/2012 15:46 | #


MOD
Exemple : MOD(5,2) = 1 car 5=2*2+1 (1 est le reste de la division euclidienne)
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 29/06/2012 16:04 | #


Belle astuce
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 29/06/2012 20:54 | #


Le modulo est un des 5 opérateurs numériques de base du C, C++, PHP, JavaScript et j'en passe. Très utile quand on y pense.
Vous n'avez jamais fait d'algo sur le PGCD ?
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 30/06/2012 00:23 | #


Il y a déjà une fonction pour ça, quand tu la découvres il n'y a plus aucun intérêt...
Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
Dark stormHors ligneMembre d'honneurPoints: 10832 Défis: 176 Message

Citer : Posté le 30/06/2012 02:45 | #


Pour le PGCD, je m'étais fait trois trucs:

1) un programme avec l'alto d'Euclide par division successives
2) ensuite, je me suis dit que par soustractions c'est serai plus simple
3) pour finir, j'ai trouve la fonction PGCD
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
CartixHors ligneMembrePoints: 2748 Défis: 98 Message

Citer : Posté le 30/06/2012 11:58 | #


Et il y a un algo pour ça dans le manuel casio
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.
Pages : 1, 2, 3Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 109 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