steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 2006
-
6 mars 2005 à 16:16
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 2006
-
11 mars 2005 à 21:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 mars 2005 à 21:04
Oui, d'accord pour ca, mais la on parle de ce qui ne peut etre inliner, tels que les callbacks ou accessoirement les expressions vectorielles (mais trés utile dans les domaines scientifiques).
L'article montre en gros que les templates permettent de résoudre à la compilation pas mal de tuyauteries imbriquées bien complexes, pour peu qu'on enrobe ca de templates qui seront forcement dérouler et inliner à la compilation.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2005 à 20:56
ben c'est clair, si j'ecris
strcpy(buff, psz);
le compilo met l'asm direct dans le code, il n'y a aucun appel de fonction car strcpy est macro.
Si on peut trouver + rapide, qu'on me le signale.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 mars 2005 à 20:39
Comment ca ? Qu'est ce que tu entends par "Aucun callback en C cause qu'il n'y a pas de fonctions" ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2005 à 20:12
Je lis cela au debut:
The expression can be inlined into the function body, which results in faster and more convenient code than C-style callback functions.
Ai-je mal compris ? On parle de fonctions de chaines genre strcpy, strcat, etc... Aucun callback en C cause qu'il n'y a pas de fonctions, le compilo met tout l'asm direct dans le code, ces pseudos fonctions ne sont que des macros.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 mars 2005 à 19:59
Les tests serieux (ceux fais avec un vrai compilateur C++ et une vrai STL) montre en gros 5% de difference, comparé au cout de maintenance infiniment plus faible.
Globalement en C++ on est cencé atteindre des performances au dessus du C car l'optimiseur dispose de plus d'information sur le code (constance, typage tres puissant, OO, templates). En C la traduction est trop proche du source (c'est plus au programmeur d'optimiser).
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 11 mars 2005 à 09:26
Tiens, bj BN
C'est vrai, que rien ne vaut l'absence de classe et l'assembleur si on recherche la perf pure
Mais les classes sont tellement plus agréable pour la séparation des opérations et la compréhension du code que l'on recherche un moindre mal en utilisant le C++
De toute façon, ce n'est pas à toi qu'il faut l'apprendre.
et on est pas d'orient à réinventer et prouver la roue toutes les 30 secondes.
Généralisation et réutilisation sont nos leitmotivs !
Magicalement
BC
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mars 2005 à 01:06
Si on cherche les performances, y a peu de chances qu'on utilise std::string ni quelque autre classe de chaine, alors...
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 mars 2005 à 20:18
par exemple, mais on prend surtout l'exemple des concatenation de chaines pour montrer à quel point l'absence d'information sur la taille est mortelle pour les performances.
std::string::operator+= est bien plus rapide que std::strcat pour concatener des chaines, de même std::string::size pulverise std::strlen, d'autant plus si la chaine est longue.
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 10 mars 2005 à 19:51
ui, size_t est là
il a une complexité de n, car il doit parcourir toute la chaine
prenons un exemple simple
si on veut afficher la chaine a l'envers,
tu va commencer par demander la taille n
et à la parcourir dans l'autre sens
soit 2n
en mémorisant la taille;
rappel mem : 1
parcours : n
soit n+1 ~ n
quoiqu'il en soit, autant stocker cette donnée...
++
Nono.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 mars 2005 à 18:16
N'oubliez pas que std::size_t est la pour ca.
Un typedef membre public
typedef std::size_t size_type;
size_type m_iTailleChaine;
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 10 mars 2005 à 15:14
unsigned long n'est pas nécessaire si unsigned int est déjà employé
sur les systemes actuels, (ie quasi tous depuis win95)
'int' est équivalent à 'long'
une idée serait peut etre de passer en 64 bytes
avec unsigned long long
mais attention, on pert alors en portabilité car ce dernier type n'est pas défini pour tous les compilateurs
++
Nono & Vic
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 10 mars 2005 à 14:07
ha et tu peux aussi rajouter des const pour certaines méthodes; par exemple:
remplace int Taille(void);
par int Taille(void) const;
ca signifie que l'appel de la méthode Taille ne modifie pas l'object CChaine que tu manipules. Ca permet ainsi d'appeler Taille() sur une référence constante d'une CChaine.
a++
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 10 mars 2005 à 14:02
salut,
pourquoi un destructeur virtuel ? ta classe CChaine n'a pas de fonctions virtuelles; si elle est utilisée comme classe de base pour manipuler des classes dérivées il n'y aura pas de polymorphisme... donc ta classe ne sera pas utilisée comme classe de base pour manipuler des classes dérivées, donc pas besoin de destructeur virtuel.
non?
Hades53
Messages postés231Date d'inscriptionmercredi 12 février 2003StatutMembreDernière intervention 7 juillet 2009 10 mars 2005 à 00:24
Pour la taille, plutôt préconiser de l'unsigned long ;)
++
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 8 mars 2005 à 14:27
Ok, merci pour vos conseils.
C'est vrai, j'aurais du penser aux const !
Merci magic_nono pour les idées, ta classe est très bien (bien que j'ai un peu de mal avec l'assembleur) !!!.
Je m'y attelle de ce pas.
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 8 mars 2005 à 12:01
Steve => cela permet parfois de gagner en vitesse et taille
bobbyantho>
lorsque tu aura modifié ceci, tes sources seront au moins 4 fois plus rapides...
en plus du point capital que Steve à cité,
il manque beaucoup de fonctionnalités (format,checkIn,...)
conversions....
jette donc un oeil sur les BString que tu trouvera dans quasi toutes mes sources
cela pourra te donner des idées pour améliorer considérablement cette classe.
Bons début,
++
Nono
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 6 mars 2005 à 16:16
Il manque tout les const, ce qui fait (entre autre) que tu n'as pas explicitement définie le constructeur de copie et l'opérateur d'affectation.
Il est aussi inutile de définir le même opérateur pour un char* (qui devrait etre const) si tu as déja définie la conversion char*->CChaine (constructeur).
11 mars 2005 à 21:04
L'article montre en gros que les templates permettent de résoudre à la compilation pas mal de tuyauteries imbriquées bien complexes, pour peu qu'on enrobe ca de templates qui seront forcement dérouler et inliner à la compilation.
11 mars 2005 à 20:56
strcpy(buff, psz);
le compilo met l'asm direct dans le code, il n'y a aucun appel de fonction car strcpy est macro.
Si on peut trouver + rapide, qu'on me le signale.
11 mars 2005 à 20:39
11 mars 2005 à 20:12
The expression can be inlined into the function body, which results in faster and more convenient code than C-style callback functions.
Ai-je mal compris ? On parle de fonctions de chaines genre strcpy, strcat, etc... Aucun callback en C cause qu'il n'y a pas de fonctions, le compilo met tout l'asm direct dans le code, ces pseudos fonctions ne sont que des macros.
11 mars 2005 à 19:59
Globalement en C++ on est cencé atteindre des performances au dessus du C car l'optimiseur dispose de plus d'information sur le code (constance, typage tres puissant, OO, templates). En C la traduction est trop proche du source (c'est plus au programmeur d'optimiser).
BruNews, si tu as le temps, tu pourrais jeter un oeil à cet article (qui n'est qu'un apercu de l'iceberg) ?
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html
11 mars 2005 à 09:26
C'est vrai, que rien ne vaut l'absence de classe et l'assembleur si on recherche la perf pure
Mais les classes sont tellement plus agréable pour la séparation des opérations et la compréhension du code que l'on recherche un moindre mal en utilisant le C++
De toute façon, ce n'est pas à toi qu'il faut l'apprendre.
et on est pas d'orient à réinventer et prouver la roue toutes les 30 secondes.
Généralisation et réutilisation sont nos leitmotivs !
Magicalement
BC
11 mars 2005 à 01:06
10 mars 2005 à 20:18
std::string::operator+= est bien plus rapide que std::strcat pour concatener des chaines, de même std::string::size pulverise std::strlen, d'autant plus si la chaine est longue.
10 mars 2005 à 19:51
il a une complexité de n, car il doit parcourir toute la chaine
prenons un exemple simple
si on veut afficher la chaine a l'envers,
tu va commencer par demander la taille n
et à la parcourir dans l'autre sens
soit 2n
en mémorisant la taille;
rappel mem : 1
parcours : n
soit n+1 ~ n
quoiqu'il en soit, autant stocker cette donnée...
++
Nono.
10 mars 2005 à 18:16
Un typedef membre public
typedef std::size_t size_type;
size_type m_iTailleChaine;
10 mars 2005 à 15:14
sur les systemes actuels, (ie quasi tous depuis win95)
'int' est équivalent à 'long'
une idée serait peut etre de passer en 64 bytes
avec unsigned long long
mais attention, on pert alors en portabilité car ce dernier type n'est pas défini pour tous les compilateurs
++
Nono & Vic
10 mars 2005 à 14:07
remplace int Taille(void);
par int Taille(void) const;
ca signifie que l'appel de la méthode Taille ne modifie pas l'object CChaine que tu manipules. Ca permet ainsi d'appeler Taille() sur une référence constante d'une CChaine.
a++
10 mars 2005 à 14:02
pourquoi un destructeur virtuel ? ta classe CChaine n'a pas de fonctions virtuelles; si elle est utilisée comme classe de base pour manipuler des classes dérivées il n'y aura pas de polymorphisme... donc ta classe ne sera pas utilisée comme classe de base pour manipuler des classes dérivées, donc pas besoin de destructeur virtuel.
non?
10 mars 2005 à 00:24
++
8 mars 2005 à 14:27
C'est vrai, j'aurais du penser aux const !
Merci magic_nono pour les idées, ta classe est très bien (bien que j'ai un peu de mal avec l'assembleur) !!!.
Je m'y attelle de ce pas.
8 mars 2005 à 12:01
bobbyantho>
lorsque tu aura modifié ceci, tes sources seront au moins 4 fois plus rapides...
en plus du point capital que Steve à cité,
il manque beaucoup de fonctionnalités (format,checkIn,...)
conversions....
jette donc un oeil sur les BString que tu trouvera dans quasi toutes mes sources
cela pourra te donner des idées pour améliorer considérablement cette classe.
Bons début,
++
Nono
6 mars 2005 à 16:16
Il est aussi inutile de définir le même opérateur pour un char* (qui devrait etre const) si tu as déja définie la conversion char*->CChaine (constructeur).