Page 1 sur 1
Procédures optimisées
Publié : mer. 05/oct./2005 21:15
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.
Publié : mer. 05/oct./2005 21:49
par Droopy
Tu peux créer des macros, exemple :
Publié : jeu. 06/oct./2005 13:15
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
Publié : jeu. 06/oct./2005 13:42
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
Publié : jeu. 06/oct./2005 13:57
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
Publié : jeu. 06/oct./2005 17:36
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!
Publié : jeu. 06/oct./2005 20:20
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

Publié : jeu. 06/oct./2005 20:34
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