Procédures optimisées

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Procédures optimisées

Message par LeCyb »

Un petit exemple vaut mieux qu'un grand discour:

Code : Tout sélectionner

Procedure passpeed()
  a = 1 + 2
EndProcedure

max = 100000000

start1 = ElapsedMilliseconds()
For i = 0 To max
  passpeed()
Next
stop1.s = Str(ElapsedMilliseconds() - start1)


start2 = ElapsedMilliseconds()
For i = 0 To max
  a = 1 + 2
Next
stop2.s = Str(ElapsedMilliseconds() - start2)

MessageRequester("Résultat",stop1 + #CRLF$ + stop2)
Comme on peut le voir l'appel de procédure donne un ratio de ± 5 par rapport à la normale.

Ma suggestion est d'avoir une option pour les procédures permettant lors de la compilation de "remplacer" le code au lieu de faire un appel.
Une option comme RProcedure ou n'importe quoi pas trop compliqué à écrire :)

D'accord l'exécutable sera plus gros mais dans certains cas quand on fait des trucs assez lourds et complexes le gain de performance n'est pas négligeable.
Je préfère un exécutable de 200k au lieu de 60k mais tournant 5 fois plus vite pour un traitement lourd.
Vive le thread-safe !
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Tu peux créer des macros, exemple :

Code : Tout sélectionner

!macro test 
!{ 
MessageRequester("test","hello") 
!} 


! test 
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Et pour compléter Droopy, les macros sont prévus dans la v4 pour répondre exactement à cette exigence:

http://purebasic.hmt-forum.com/viewtopi ... ight=macro
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

En fait y'a trois choses avec les procédures PB...
- comme toute procédure elles passent par la pile (donc des instructions en plus)
- certains registres sont protégés et même quand il sont à 100% "en sécurité"
- les variables locales sont automatiquement mises à zéro

ton a = 1 + 2
devient
charger les parametres sur la pile (ca c bon y'en a pas)
appeller la fonciton
préserver les registres
réserver l'espace nécessaire au variables locales (ici y'en a une)
les mettre à 0 (fait avec une boucle même si y'en a un seul =)
mettre 3 dans a (ca c'est optimisé :p)
libérer toute la mémoire utilisée sur la pile
récupérer les registres protégés
retourner apres l'appel de la procédure

ca en fait beaucoup des instructions ^^
comme le suggérais Denis il faudrait des ProcedureASM où toutes les tâches parfois inutiles (comme mettre a à zéro avant d'y mettre trois) sont réservées au programmeur...
http://purebasic.hmt-forum.com/viewtopic.php?t=3227

Dri

Dri
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dri,

il y a une chose encore (je ne sais pas si tu as remarqué dans le code asm au début des procedures avec paramètres)

tous les paramètres sont recrés sur la pile, donc pas possible de modifier directement par exemple une chaîne sauf à passer son adresse

Dans le cas des string, PB cré sur la pile une variable locale pour stocker l'adresse et réalloue de la mémoire pour faire une copie de la chaîne et tout ce qui se passe sur la chaîne dans la procedure se fera sur cette "nouvelle chaîne" .

Il me semble avoir vu sur le forum anglais que cela pourrait évoluer ( c'est loin déjà), soit garder ce mode qui fonctionne bien dans une grande majorité des cas soit travailler directement avec les paramètres.

Lorsque je veux modifier directement la chaîne, je passe son adresse et je travaille avec cette adresse
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Je pense qu'un certain nombre de fonctions devraient aussi être remplacées en dur dans le programme, afin d'éviter des call, et tout le toutim.

Je pense notamment aux fonctions agissant sur les listes chaînées. Un seul call dans une boucle sur des milliers d'éléments fait perdre un temps précieux!
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Me suis certainement mal exprimé, l'idée était tout simplement les macros mais j'ai pas mis le même nom dessus :D
Vive le thread-safe !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Denis
Je l'ai constaté avec la fonction triangle que j'ai postée sur le forum officiel. Les arguments ont beau être empilés "à l'envers" PB les remet dans l'ordre.

Dri
Répondre