c'est lent... faut voir si c'est pour des chaine longue ou non sinon ya moyen d'optimiser..
null Le 28/09/2003 à 21:09 Au fait si dans fonction FindNextChar() je mets les premiers paramètres en registres c'est mieux en vitesse ?
unsigned short FindNextChar(register char Char asm("%a0"), unsigned short current_position asm("%a1"), char *buffer)
{
char *tmp = &(buffer[current_position]);
while(*tmp && *(tmp++) != Char)
current_position++;
return current_position;
}
En tout cas je gagne en place. Au passage TIGCC est vraiment génial ! J'ai suis passé de 12 ko à 11 ko.
www.wikio.fr/user1921&info=comments
BiHi Le 28/09/2003 à 21:17 Tu peux aussi déclarer ta fonction comme ça pour passer les arguments par registre:
__attribute((__regparm__))
unsigned short FindNextChar(char Char, unsigned short current_position, char *buffer);

;)
Pour un short comme ton current_position, je te conseille plutôt %d0.
Et sinon, tu peux aussi utiliser %a2, %a3 et %a4 pour le passage par registres (et %a5 si tu n'utilises pas OPTIMIZE_ROM_CALLS, mais surtout ne touche pas à %a6 (%fp) et %a7 (%sp), sinon GCC ne va pas aimer).
null Le 28/09/2003 à 21:26 Ok, merci.
Et je voulais savoir, Kevin, c'est laquelle de fonction qui sera la plus rapide entre celle-là :
char *sub_str(unsigned int begin, unsigned int end, char *str)
{
unsigned int i=0,j=0;
char *str_return = malloc((end-begin+1));
for(i=begin;i<end;i++)
{
str_return[j]=str[i];
j++;
}
str_return[j]=0;
return str_return;
}
et celle-là :
char *sub_str(int begin, int end, char *str asm("a0"))
{
int i = end-begin+1;
char *str_return = malloc(i), *tmp;
str += begin;
tmp = str_return;
while(--i) {
*tmp++ = *str++;
}
*tmp = 0;
return str_return;
}
Parce-que dans mon bench avec la fonction qui utilise les pointeurs, j'obtiens des résultats très aléatoire et des fois c'est pire que la première fonction. C'est normale ? C'est peut-être mon bench qui est mal foutu aussi. Mais qd j'utilise des pointeurs pour mes fonctions les perforamances sont très aléatoire.
www.wikio.fr/user1921&info=comments
Zeph Le 28/09/2003 à 21:27 Ton bench est surement mal foutu. Sinon à vue de nez je pense que la 2eme est plus rapide (enfin si GCC l'optimise comme il faut, ce que je pense qu'il fait).

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Je confirme ce qu'a dit Vertyos: normalement, la solution avec les pointeurs devrait être plus rapide. Mais sache que GCC sait convertir la première en la deuxième dans certains cas, ce qui explique peut-être tes résultats bizarres.
null Le 29/09/2003 à 08:30 Ouais, ok. Mais dans tout les cas c'est sûr que ce sera plus optimisé en taille et en rapidité en utilisant les pointeurs ?
Parce-que là je vois bien que je gagne déjà en place.
Et au fait avec les registre : si je met asm("a0") dans les paramètres des fonctions je gagne souvent quelque mais si je met asm("a2") je perd souvent bcp d'octets !
www.wikio.fr/user1921&info=comments
La grosse différence est que a0 est détruit par les appels de fonctions, a2 non. Dans certains cas, l'un est mieux, dans certains cas l'autre. À essayer cas par cas.
Tu peux aussi te contenter d'utiliser __attribute__((regparm)), comme ça le compilo peut décider de la meilleure solution. Ce n'est pas souvent une bonne idée de nommer directement en asm les paramètres si tu n'as pas absolument besoin de le mettre dans cette variable précise.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
null Le 29/09/2003 à 18:07 Ouais, je m'en doute bien et il suffit de mettre ça devant la fonction ?
Et c'est peux optimiser à la foisla taille et à la fois la vitesse ? Enfin le gain en vitesse sera peut-être minime ?
www.wikio.fr/user1921&info=comments
Le gain en vitesse est important lui aussi, surtout pour les chaînes de petites tailles. Si tu ne mets pas ça, le compilo va devoir copier l'adresse de la chaîne dans la pile, puis lire cette adresse dans la pile, et enfin restaurer la valeur du pointeur de pile.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Le compilo peut parfaitement générer des infos supplémentaires sur la fonction. Par exemple, l'assembleur TIGCC 0.95 génère des infos supplémentaires sur le code. Si on pousse la logique plus loin, c'est ce qu'on obtient - et on pourrait encore faire pas mal d'optimisations globales de ce style pour améliorer significativement le code ...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Oui, mais ça fait partie des possibilités d'optimisation. En tout cas c'est bien plus crédible que l'hypothèse selon laquelle le fait que le compilo suppose que les opérations signées n'overflowent pas permettrait souvent d'énormes optimisations.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)