Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 2008
-
11 avril 2004 à 22:16
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 2004
-
7 mai 2004 à 21:42
Salut,
1- J'aimerais savoir ou trouver la vitesse d'execution des operations elementaires (add, mov, ...) et plus evoluées (sqrtf, cos, ...) .
Pour un processeur AMD.
2- La plupart des processeurs ont une architecture 32-bits, la taille d'un int. Est-il cependant plus rapide de travailler sur des unsigned short int ou des WORD ? (Au fait, c'est quoi la difference entre WORD, short int et unsigned short int ?)
3- Avez-vous des astuces simples pour accelerer un programme ?
Exemple:
Parmi les 2 methodes differentes suivantes pour appeler un membre d'une classe, il y en a bien une plus rapide que l'autre.
------------------------
class deFrancais
{
public:
int nombre;
}
deFrancais *pc_deFrancais;
int n;
n=pc_deFrancais->nombre;
------------------------
class deFrancais
{
protected: (ou private, je ne sais pas la difference)
int nombre;
public:
int getNombre(void) {return nombre;}
}
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 12 avril 2004 à 01:31
private ==> accessible uniquement dans la classe
protected ==> idem mais aussi dans les classes filles
les 2 methode se vale, par defaut un ascesseur defini dans le corps de la classe est inline
sur les machine 32 bits il vaut mieux utiliser le type int ou long qui sont sur 32 bits, mais c'est le type long qui est reelement natif, le type int est fixé dans la norme a 32 bits, donc sur un proco 64 bits il vaut mieux utiliser le long
sinon pour accelerer un programme, ya les fonction inline (macros en c), __fastcall, le design de tes classes joue aussi
je te conseil de redefinir qq fonction de math.h, redefini aussi les conteneur de la stl que tu veux utiliser, deroule tes boucles qd tu peux, faire attention a l'initialisation de tes variable, par ex si tu fait
float x=0; tu perd le temps d'un cast, fait plutot float x=0.0f
utilise memset, memcpy qd tu peux
utilise des decalage binaire qd tu veux diviser/multiplier par 2^n
met les variables les plus utilisées d'un bloc en register (seulement les plus utilisées car elles ne le seront pas tt et il se peut que ce soit fait implicitement par ton compilo)
pour les constructeur de tes classes, initialise les champs avant le corps
struct A
{
int a;
A() : a(0) {}
};
plutot que
struct A
{
int a;
A() { a=0; }
}
sinon les attributs ne seront pa initialiser lors de leur creation
bon la liste est bien sur plus longue, a suivre koi ;)
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 13 avril 2004 à 21:07
ben vui c'est vrai qu'un petit tuto ca pourrait le faire, mais je me sens pas (encore) capable d'assumer un tel truc, comme je l'ai dit la liste est longue, des connaissance en asm ne sont pas de trop
mais si tu ve enrichir ta culture sur le sujet ya qq truc comme regarder les sources de john carmack ou alors te balader sur les site de game dev & optimisation, comme www.flipcode.com et son forum, nehe (pour l'opengl), www.gametutorials.com ...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 24 avril 2004 à 23:22
Ok, merci beaucoup djl !
Je vais essayer d'optimiser mon code avec tes astuces.
Sinon est-ce que ca vaut vraiment le coup de programmer en ASM les routines tres souvent appelées.
Car si on connait bien l'assembleur, on peut programmer en C++ en raisonnant en ASM: cad, en faisant en sorte que le compilateur compile le code en C++ comme il l'aurait fait avec l'equivalent en ASM.
EX: favoriser les while aux for.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 28 avril 2004 à 08:18
Un short est codé sur 2 fois moins de place qu'un int (en 32 bits). Mais est-ce que le processeur execute 2 fois plus rapidement des operations sur des shorts ? (Car plus haut tu as dit qu'il vallait mieux travailler sur des entiers dont la taille est celle de l'architecture du processeur. En gros, dans tous les cas, il faut favoriser les int a tous les autres entiers ???)
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 28 avril 2004 à 19:58
utilise le type int, ca correspond a un mot processeur, si tu utilise un short il sera converti en int lors d'une operation donc c'est deja ca de perdu
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 29 avril 2004 à 13:28
Merci beaucoup.
Je vais donc changer tous les short en int (dans mon cas, mieux vaut privilegier la vitesse a la memoire).
A propos d'optimisation:
Comment sont compilées les variables locales aux fonctions?
Sont-elles presentes dans le corps de la fonction, ou juste utilisées via des registres?
ex: (un exemple super con qui ne sert a rien :-))
int pourri(int a)
{
int i = 1000;
int b = 50;
while (i)
{
i--;
a++;
b+=a*i;
}
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 29 avril 2004 à 20:16
je connais pas l'asm mais je vois ce que tu ve dire
int pourri()
{
int a; // a est declaré sur la pile
// sa duree de vie est celle de la fonction
static int b; // b est static, il se trouve
// dans la zone de donnée (je crois) et sa
// duree de vie est celle du programme
// cependant sa visibilite est celle de la
// fonction pourri
register int c; // c est declaré dans un registre du
// processeur, le top au niveau de l'acces, mais
// sera reelement dans le registre seulement si ill y
// a de la place
}
note : en C (ansi et pre ansi) le type par defaut est int donc les ecritures
static i; ou
register i; sont supporte, c'est juste equivalent a
cs_AlexMAN
Messages postés1536Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention24 mai 20091 30 avril 2004 à 19:40
djl, ta derniere remarque est pas fausse mais inutilee, car toutes les variables de classe d'allocation statique sont initialisées a leur declaration avec la valeur 0...Je veux pas dire de betises, c'est tout de mm a vérifier...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 2 mai 2004 à 01:07
Merci pour vos réponses et les precisions !
Quand on compile en Release, on peut choisir le mode "Maximun Speed". Le compilateur cherche donc à optimser le programme en vitesse, met-il automatiquement les variables les plus utilisées en registres ? Ou que fait-il de particulier par rapport aux autres modes ? Il ne modifie pas l'algorithme quand meme...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 2 mai 2004 à 01:07
Merci pour vos réponses et les precisions !
Quand on compile en Release, on peut choisir le mode "Maximun Speed". Le compilateur cherche donc à optimser le programme en vitesse, met-il automatiquement les variables les plus utilisées en registres ? Ou que fait-il de particulier par rapport aux autres modes ? Il ne modifie pas l'algorithme quand meme...
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 2 mai 2004 à 23:46
non il ne modifie pas l'algorithme,je sais juste qu'en debug ta plus de memoire pour les données du process (pour prevenir les debordement)
quand aux optimisation, elles sont presente sur tout les compilo, faut donc regarder la doc. certain compilo sont reputé pour pour ca, tel que watcom c++
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 5 mai 2004 à 20:04
C'est louche, j'avais posté un mail je ne sais plus trop quand pour repondre au dernier message (celui du 02/05/2004 23:46:05 de djl), tout s'etait bien deroulé: message envoyé, mais le message n'est pas passé. Par contre, ca a posté le dernier message que j'avais tapé, juste derriere ce dernier (d'ou mon message en double)!
Je ne me suis pas amusé a poster le meme message avec 12 min d'ecart quand meme!
Bon, tant pis... je recommence.
Merci djl de répondre a toutes mes questions pas forcement palpitantes :-) !
Mais j'ai toujours des problemes :-) (de moins en moins, faut se dire ca).
Dans mes programmes, j'utilise tres souvent (plusieurs 10n de milliers de fois par boucle), point[i]->
Donc le pointeur se tape une addition *(point + i) un nombre enorme de fois, alors qu'il suffirait de le calculer une fois pour toute.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 5 mai 2004 à 20:45
ben non tes questions sont interessantes je trouve, et pertinantes
oui point[i] <=> *(point + i ) et aussi i[point] mais c'est deja moins lisible
tu utilise l'operateur -> donc point est un tableau de pointeur par contre je sais pas de quel type mais dans tout les cas tu sera quand mem obligé de le deferencer
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 7 mai 2004 à 21:07
Ok, merci ca marche !
Ca optimise pas des masses .... 3-5% je dirais, c'est deja ça !
C'est vrai, c'est plus facile de definir le pointeur avec la classe qu'il pointe sans utiliser les VOID.
Mais ainsi créé, le pointeur n'est pas un vrai pointeur car il ne peut pointer qu'un type de classe.
Le tres maigre avantage du C++ sur les pointeurs, c'est que lorsqu'on fait pointeur++, on se deplace dans la memoire de la taille de la classe, et pas de 1 octet comme en assembleur.
Revenons a nos moutons, si je veux definir un pointeur dont je ne connais pas le type a l'avance, il faut utiliser un VOID C'est ce qui est fait dans la classe CCube, partie creation de vertices: