Derniers sujets
» L'immonde Docteur Kokus
Mar 17 Oct 2017 - 18:46 par Dom50

» Rencontre avec Emmanuel Viau (ERE informatique)
Mar 17 Oct 2017 - 18:17 par Dom50

» Organisation RAM vidéo
Mar 17 Oct 2017 - 14:26 par Davros

» OVERLAYS : est-ce accessible avec LCC65
Lun 16 Oct 2017 - 14:47 par Jede

» Holdies
Dim 15 Oct 2017 - 21:09 par Dbug

» Infocarte ORIC
Dim 15 Oct 2017 - 13:26 par fred72

» Alchimie DOUZE
Dim 15 Oct 2017 - 8:46 par kenneth

» maxiNoob apprend le C
Ven 13 Oct 2017 - 22:55 par Dbug

» page zéro ?
Ven 13 Oct 2017 - 22:36 par Dbug

» Orix : Thread de notification sur le développement
Jeu 12 Oct 2017 - 22:25 par Jede

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités

Aucun

Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion

Récupérer mon mot de passe

Statistiques
Nous avons 123 membres enregistrés
L'utilisateur enregistré le plus récent est james64

Nos membres ont posté un total de 5719 messages dans 417 sujets
Portail ORIC




optimiser la boucle de saisie "Que faites-vous?" ?

Voir le sujet précédent Voir le sujet suivant Aller en bas

optimiser la boucle de saisie "Que faites-vous?" ?

Message  goyo le Jeu 15 Mai 2014 - 10:29

Voici une boucle qui permet la saisie d'un texte tout en traitant des événements dans la même boucle.
Cette boucle me permet de saisir les commandes de l'aventurier après la phrase "Que faites-vous?".

Le problème est qu'elle est assez lente, quelqu'un verrait il le moyen de l'optimiser (mais toujours en Basic) afin de gagner en rapidité ?

Code:
10310 AF=0:CUR=127:R$=CHR$(13):XX=12:
GP=10410:GC=10420:TI=0'TIMER          
  
10312 IFAS=#BD46THENXX=8' AS=position sur la ram vidéo  
  
10315 GOSUBGC'affiche curseur
  
10316 '
10320 REPEAT                        
                                        
  
10330 K$=KEY$                        
                                        
  
10340 IFK$=CHR$(13)THEN10380        
  
10345 ' saisie texte normal
10350 IFK$>R$ANDK$<CHR$(127)ANDTX<XXTHENGOSUBGP:TX=TX+1:TEX$=TEX$+K$:GOSUBG
C
10355 ' delete
10360 IFK$=CHR$(127)ANDTX>0THENTX=TX-
1:TEX$=LEFT$(TEX$,TX):ZAP:GOSUBGC
  
10375 TM=TM+1:FORVV=1TO10:NEXTVV    
  
10376 ' traite des evennements liés à la room courante
10377 GOSUB 4000' GESTION EVENNEMENTS
  
10380 UNTILK$=CHR$(13)ORMO=1' mo=mort        
  
10385 '                              
  
10387 POKEAS+TX,32'affiche le curseur à la derniere position de TX                
  
10390 RETURN                        
  
10400 'afffiche cursor              
  
10410 '                              
  
10415 POKEAS+TX,ASC(K$):PING:RETURN' affiche le caractere saisi  
  
10420 POKEAS+TX,CUR:POKEAS+TX+1,32:RE
TURN' affiche le curseur    
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  Hialmar le Jeu 15 Mai 2014 - 10:38

Salut,

Déjà tu peux virer ta boucle autour de VV qui ne fait rien.

Ensuite, perso, je ne testerai les événements dans la pièce (GOSUB 4000) que tous les X pas de boucle globale (X étant à dimensionner en fonction du temps que prend la boucle sans la gestion des événements et avec cette gestion). Ca devrait accélérer pas mal car à mon avis c'est ça qui est le plus long dans cette boucle.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  goyo le Jeu 15 Mai 2014 - 12:50

Hialmar a écrit:Salut,

Déjà tu peux virer ta boucle autour de VV qui ne fait rien.

Ensuite, perso, je ne testerai les événements dans la pièce (GOSUB 4000) que tous les X pas de boucle globale (X étant à dimensionner en fonction du temps que prend la boucle sans la gestion des événements et avec cette gestion). Ca devrait accélérer pas mal car à mon avis c'est ça qui est le plus long dans cette boucle.

Merci Hialmar
concernant le
Code:
FORVV=1TO10:NEXTVV
c'est une réserve de performance qui disparaîtra pour la version finale.

Est ce que tu veux dire par tester tous les X, c'est par exemple traiter les événements une fois sur 10 dans la boucle ?  :
Code:
10377 X=X+1:IF X=10 THEN GOSUB 4000:X=0 ' traite evennements une fois sur 10 boucles
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  Hialmar le Jeu 15 Mai 2014 - 13:06

Oui c'est exactement ça.

Je pense que c'est ce qui est derrière le GOSUB qui te ralenti non ?
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  goyo le Jeu 15 Mai 2014 - 17:21

Hialmar a écrit:Oui c'est exactement ça.

Je pense que c'est ce qui est derrière le GOSUB qui te ralenti non ?

Oui, merci pour l'idée.
Dans la routine évènement y a une série de IF, ça doit effctivement être significatif au niveau du temps gagné.
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  Hialmar le Jeu 15 Mai 2014 - 17:24

Oui surtout que tes comparaisons doivent être entre chaines de caractères et donc il lui faut comparer caractère par caractère jusqu'à en trouver un de différent. Du coup ça doit ralentir pas mal.

A part ça, ce qui doit ramer c'est la construction de la chaine de caractères mais là sans faire d'assembleur je vois pas trop comment optimiser.
avatar
Hialmar
Admin

Messages : 815
Date d'inscription : 03/03/2014
Age : 47
Localisation : Toulouse

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  assinie le Jeu 15 Mai 2014 - 23:45

Bonsoir, tout dépend de ce que tu veux accélérer.

Si c'est global, tu as plutôt intérêt à faire des comparaisons sur des valeurs numériques:
IF A>B THEN xxxx est pratiquement 2 fois plus rapide que IF A$>CHR$(13) THEN xxxx

De même un GOTO NL est plus généralement plus rapide qu'un GOTO 1000

Si ce que tu veux c'est exécuter les lignes 10375 / 10377 et la procédure en 4000 le plus souvent possible entre 2 touches appuyées, il faut que tu élimines le plus tôt possible le cas général qui est "pas de touche enfoncée"...
Dans ce cas, tu peux remplacer la ligne 10330 par
10330 K$=KEY$:IF K$="" THEN 10375

Dans le même ordre d'idée, tu peux ajouter un GOTO 10375 à la fin de la ligne 10350.

Le problème sera la durée d'exécution de la routine en 4000 qui pourra ralentir la saisie puisqu'elle est exécutée plus souvent.

Ca donne un truc dans ce genre (j'ai ajouté des espaces pour la lisibilité):
Code:

10310 AF=0:CUR=127:R=13:XX=12: GP=10410:GC=10420:TI=0'TIMER

10311 L1=10375:L2=10380:GE=4000

10312 IF AS=#BD46 THEN XX=8' AS=position sur la ram vidéo
10315 GOSUB GC 'affiche curseur
10316 '
10320 REPEAT

10330 K$=KEY$:IF K$="" THEN GOTO L1
10340 K=ASC(K$):IF K=R THEN GOTO L2
10342 IF K<R OR K>CUR THEN GOTO L1
10345 ' saisie texte normal
10350 IF K<>CUR AND TX<XX THEN GOSUB GP:TX=TX+1:TEX$=TEX$+K$:GOSUB GC:GOTO L1
10355 ' delete
10360 IF K=CUR AND TX>0 THEN TX=TX-1:TEX$=LEFT$(TEX$,TX):ZAP:GOSUB GC

10375 TM=TM+1:FOR VV=1 TO 10:NEXTVV
10376 ' traite des evennements liés à la room courante
10377 GOSUB GE' GESTION EVENNEMENTS

10380 UNTIL K=R OR MO=1' mo=mort
10385 '
10387 POKE AS+TX,32'affiche le curseur à la derniere position de TX
10390 RETURN

10400 'afffiche cursor
10410 '
10415 POKE AS+TX,K:PING:RETURN' affiche le caractere saisi
10420 POKE AS+TX,CUR:POKEAS+TX+1,32:RETURN' affiche le curseur

GP devrait être égale à 10415
L'utilisation de K=ASC(K$) en 10340, permet de faire des tests numériques et d'éviter le ASC(K$) en ligne 10415

J'ai poussé l'utilisation des variables un peu loin c'est sûr...
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  goyo le Ven 16 Mai 2014 - 18:33

assinie a écrit:Bonsoir, tout dépend de ce que tu veux accélérer.

Si c'est global, tu as plutôt intérêt à faire des comparaisons sur des valeurs numériques:
IF A>B THEN xxxx est pratiquement 2 fois plus rapide que IF A$>CHR$(13) THEN xxxx

De même un GOTO NL est plus généralement plus rapide qu'un GOTO 1000

Si ce que tu veux c'est exécuter les lignes 10375 / 10377 et la procédure en 4000 le plus souvent possible entre 2 touches appuyées, il faut que tu élimines le plus tôt possible le cas général qui est "pas de touche enfoncée"...
Dans ce cas, tu peux remplacer la ligne 10330 par
10330 K$=KEY$:IF K$="" THEN 10375

Dans le même ordre d'idée, tu peux ajouter un GOTO 10375 à la fin de la ligne 10350.

Le problème sera la durée d'exécution de la routine en 4000 qui pourra ralentir la saisie puisqu'elle est exécutée plus souvent.

Ca donne un truc dans ce genre (j'ai ajouté des espaces pour la lisibilité):
Code:

10310 AF=0:CUR=127:R=13:XX=12: GP=10410:GC=10420:TI=0'TIMER

10311 L1=10375:L2=10380:GE=4000

10312 IF AS=#BD46 THEN XX=8' AS=position sur la ram vidéo
10315 GOSUB GC 'affiche curseur
10316 '
10320 REPEAT

10330 K$=KEY$:IF K$="" THEN GOTO L1
10340 K=ASC(K$):IF K=R THEN GOTO L2
10342 IF K<R OR K>CUR THEN GOTO L1
10345 ' saisie texte normal
10350 IF K<>CUR AND TX<XX THEN GOSUB GP:TX=TX+1:TEX$=TEX$+K$:GOSUB GC:GOTO L1
10355 ' delete
10360 IF K=CUR AND TX>0 THEN TX=TX-1:TEX$=LEFT$(TEX$,TX):ZAP:GOSUB GC

10375 TM=TM+1:FOR VV=1 TO 10:NEXTVV
10376 ' traite des evennements liés à la room courante
10377 GOSUB GE' GESTION EVENNEMENTS

10380 UNTIL K=R OR MO=1' mo=mort
10385 '
10387 POKE AS+TX,32'affiche le curseur à la derniere position de TX
10390 RETURN

10400 'afffiche cursor
10410 '
10415 POKE AS+TX,K:PING:RETURN' affiche le caractere saisi
10420 POKE AS+TX,CUR:POKEAS+TX+1,32:RETURN' affiche le curseur

GP devrait être égale à 10415
L'utilisation de K=ASC(K$) en 10340, permet de faire des tests numériques et d'éviter le ASC(K$) en ligne 10415

J'ai poussé l'utilisation des variables un peu loin c'est sûr...

super ! avec ces conseils je pourrais pas mal optimiser.

En outre, est ce que utiliser un A% et plus rapide qu'un A normal ?
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Optimiser la boucle de saisie

Message  Zodiac le Ven 16 Mai 2014 - 18:59

Bonjour GWEG,

Les variables entières ne procurent aucun avantage, bien au contraire elles sont plus lentes, car l'ORIC les transforment en virgule flottante avant utilisation.
Concernant les variables entières, le seul gain se situe au niveau de la place occupée en mémoire et seulement pour les tableaux d'entiers.

A+
avatar
Zodiac

Messages : 93
Date d'inscription : 27/01/2014
Localisation : Yvelines

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  goyo le Sam 17 Mai 2014 - 18:07

Zodiac a écrit:Bonjour GWEG,

Les variables entières ne procurent aucun avantage, bien au contraire elles sont plus lentes, car l'ORIC les transforment en virgule flottante avant utilisation.
Concernant les variables entières, le seul gain se situe au niveau de la place occupée en mémoire et seulement pour les tableaux d'entiers.

A+

Oki, merci Zodiac pour l'info Smile
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: optimiser la boucle de saisie "Que faites-vous?" ?

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum