Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
731 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

Conseils et techniques d'optimisation C/C++

n°1523176
Joel F
Real men use unique_ptr
Posté le 03-03-2007 à 00:31:11  profilanswer
 

Reprise du message précédent :

tithub a écrit :


 - Doit-on préféré les switchs au if ?
oui


 
source :o preuve :o resultats :o car je vois VRAIMENT pas dans quel cas cela est vrai  
(je suis curieux hein, faut prendre la question mal ^^)
 
le premier lien, je troue moche qu'on commence un corus de C++ par du rappel de C et ud ùmelange moche. Un bon cours de C++ ne devrait MEME PAS parler des pointeurs avant d'arriver au polymorphisme et forcer l'utilsiation de string et vector pr ce qui est de gerer les chaines//tableaux dynamiques AMHA.

Message cité 3 fois
Message édité par Joel F le 03-03-2007 à 00:32:36
mood
Publicité
Posté le 03-03-2007 à 00:31:11  profilanswer
 

n°1523177
tbp
Posté le 03-03-2007 à 01:07:42  profilanswer
 

el muchacho a écrit :

Bonjour, toute petite suggestion: choisir des couleurs différentes pour les lignes sur la gauche (voire des styles de pointillés pour l'impression).


Ah, mais je crois qu'il est évident que j'ai des gouts de chiottes. Et encore! J'ai fait des efforts pour éviter le syndrome  de l'arc en ciel RGB.
La remarque sur la feuille de style pour impression est très judicieuse et ne m'avait pas effleuré.
 

Joel F a écrit :

source :o preuve :o resultats :o car je vois VRAIMENT pas dans quel cas cela est vrai  
(je suis curieux hein, faut prendre la question mal ^^)


Pour ma part je suis curieux de savoir pourquoi tu ne fais pas la démonstration inverse.  
Lire http://www.gccsummit.org/2006/view [...] ent_key=18 en préambule pourrait donner des angles d'attaque. Enfin ce que j'en dis...
 

Joel F a écrit :

le premier lien, je troue moche qu'on commence un corus de C++ par du rappel de C et ud ùmelange moche. Un bon cours de C++ ne devrait MEME PAS parler des pointeurs avant d'arriver au polymorphisme et forcer l'utilsiation de string et vector pr ce qui est de gerer les chaines//tableaux dynamiques AMHA.


En même temps si je ne me trompe c'est un cours sur le C++, pas Java. On peut vivre dans le dénie de la compatibilité C, mais est-ce bien sage?

n°1523195
Taz
bisounours-codeur
Posté le 03-03-2007 à 10:07:11  profilanswer
 

Joel F a écrit :

source :o preuve :o resultats :o car je vois VRAIMENT pas dans quel cas cela est vrai  
(je suis curieux hein, faut prendre la question mal ^^)

sur des gros switchs, j'ai déjà vu des optimisations pas mal avec des tables toussa. faudrait trouver un code de démo. Après le switch c'est quand même plus lisible.

n°1523202
Joel F
Real men use unique_ptr
Posté le 03-03-2007 à 11:05:32  profilanswer
 

tbp a écrit :


Pour ma part je suis curieux de savoir pourquoi tu ne fais pas la démonstration inverse.  
Lire http://www.gccsummit.org/2006/view [...] ent_key=18 en préambule pourrait donner des angles d'attaque. Enfin ce que j'en dis...


Merci du lien :) Comme je le disais, l'affirmation se semblait zarb. Merci pour la doc.
 

tbp a écrit :


En même temps si je ne me trompe c'est un cours sur le C++, pas Java. On peut vivre dans le dénie de la compatibilité C, mais est-ce bien sage?


Pour enseigner la POO et le C++ oui. Enseigner la compatibilité C se fait tard, pour eviter que les gus prennent de sales habitudes à faire des char* machaine = new char[10] etc ...

n°1523248
0x90
Posté le 03-03-2007 à 15:33:03  profilanswer
 

Joel F a écrit :


Pour enseigner la POO et le C++ oui. Enseigner la compatibilité C se fait tard, pour eviter que les gus prennent de sales habitudes à faire des char* machaine = new char[10] etc ...


 
En même temps pour enseigner la POO le C++ n'est pas forcément la panacée  [:0x90]  


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1523327
Joel F
Real men use unique_ptr
Posté le 03-03-2007 à 22:35:15  profilanswer
 

0x90 a écrit :

En même temps pour enseigner la POO le C++ n'est pas forcément la panacée  [:0x90]


 
Allez je te donne un indice : c'ets deux cours séparé :o

n°1523951
tithub
Posté le 05-03-2007 à 17:22:27  profilanswer
 

La structure de contrôle switch, quand elle peut être utilisée, est préférable car elle permet souvent une meilleure lisibilité du code. De plus au niveau optimisation elle est meilleure car elle ne génère qu'un seul bloc de code, contrairement aux if.
 
Le C++ étant une extension du C, je ne vois pas ce qu'il y a d'illogique à commencer un cours de C++ par quelques notions indispensables de C.  
Si l'ordre des chapitres ne te conviens pas tu peux aussi les lire dans le désordre  :) Sinon je te conseille vraiment Thinking in C++ de Bruce Heckel d'autant que l'organisation du livre te correspond mieux (ça commence par la notion d'objet).  
L'utilisation de string et vector permet d'éviter les erreurs d'allocations de mémoire et de dépassements de tampon. De plus l'implémentation de la stl est en général très optimisée. Si tu as implémenté tes propres classes plus rapides et sans leak mémoire, ou si tu veux utiliser d'autres librairies, très bien.
 
D'une manière générale, je dirais que si tu veux gagner des picosecondes, mets-toi à l'assembleur !
 
 

n°1524018
Joel F
Real men use unique_ptr
Posté le 05-03-2007 à 18:06:22  profilanswer
 

tithub a écrit :


Le C++ étant une extension du C, je ne vois pas ce qu'il y a d'illogique à commencer un cours de C++ par quelques notions indispensables de C.  


Non, le C++ reprends des éléments syntaxiques du C. Point barre.  
 

tithub a écrit :


Si l'ordre des chapitres ne te conviens pas tu peux aussi les lire dans le désordre  :) Sinon je te conseille vraiment Thinking in C++ de Bruce Heckel d'autant que l'organisation du livre te correspond mieux (ça commence par la notion d'objet).  


ouais merci :o j'en ai besoin :o
 

tithub a écrit :


L'utilisation de string et vector permet d'éviter les erreurs d'allocations de mémoire et de dépassements de tampon. De plus l'implémentation de la stl est en général très optimisée. Si tu as implémenté tes propres classes plus rapides et sans leak mémoire, ou si tu veux utiliser d'autres librairies, très bien.


ai-je dis le contraire o_O ? et t'inquiétes, oui mes classes de vecteurs et de matrices vont bien plus vite que la STL :o
 

tithub a écrit :


D'une manière générale, je dirais que si tu veux gagner des picosecondes, mets-toi à l'assembleur !


 
ouais ouais  :sarcastic: les intrinsics Altivec et SSE2 me suffisent bien merci :o

n°1524029
0x90
Posté le 05-03-2007 à 18:10:50  profilanswer
 

Joel F a écrit :

Non, le C++ reprends des éléments syntaxiques du C. Point barre.  


Un peu plus que ça quand même, sinon il n'y aurait pas autant de blahblah dans la spec c++ sur la libc et la compatibilité mémoire des POD et ptêtre d'autres trucs que j'ai oublié/pavu.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1524033
Joel F
Real men use unique_ptr
Posté le 05-03-2007 à 18:14:39  profilanswer
 

0x90 a écrit :

Un peu plus que ça quand même, sinon il n'y aurait pas autant de blahblah dans la spec c++ sur la libc et la compatibilité mémoire des POD et ptêtre d'autres trucs que j'ai oublié/pavu.


 
Certes mais je pense que dissocier l'apprentissage des deux langages et nécessaires.
Le "C with classes" ca va cinq minute ...

mood
Publicité
Posté le 05-03-2007 à 18:14:39  profilanswer
 

n°1524035
masklinn
í dag viðrar vel til loftárása
Posté le 05-03-2007 à 18:26:33  profilanswer
 

Joel F a écrit :

source :o preuve :o resultats :o car je vois VRAIMENT pas dans quel cas cela est vrai


On peut pas écrire de Duff's Device avec des if/else if/else :o
 
Donc Switch/case > if/else :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1524037
0x90
Posté le 05-03-2007 à 18:30:55  profilanswer
 

masklinn a écrit :

On peut pas écrire de Duff's Device avec des if/else if/else :o
 
Donc Switch/case > if/else :o


 
setjmp/longjmp FTW :o


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1524040
Joel F
Real men use unique_ptr
Posté le 05-03-2007 à 18:38:18  profilanswer
 

masklinn a écrit :

On peut pas écrire de Duff's Device avec des if/else if/else :o
 
Donc Switch/case > if/else :o


 
 :whistle: ca je te l'accorde

n°1524079
tbp
Posté le 05-03-2007 à 20:10:59  profilanswer
 

Joel F a écrit :

Certes mais je pense que dissocier l'apprentissage des deux langages et nécessaires.
Le "C with classes" ca va cinq minute ...


Soudain je réalise que le nom même du langage est, à coup sur, due à une affreuse méprise: les doigts de Stroustrup dérapent sur le clavier - franchement C++ c'est nawak -, et hop! une génération de programmeux s'entête à croire qu'il y a une filiation. Avouez que c'est ballot.

n°1524090
Joel F
Real men use unique_ptr
Posté le 05-03-2007 à 20:53:22  profilanswer
 

ca manque de :o et de [:pingouino] :p


Message édité par Joel F le 05-03-2007 à 20:53:36
n°1657947
gee
Bon ben hon
Posté le 13-12-2007 à 18:13:59  profilanswer
 

masklinn a écrit :


On peut pas écrire de Duff's Device avec des if/else if/else :o
 
Donc Switch/case > if/else :o


 
 
Suite à ce poste j'ai cherché ce qu'est un Duff's Device mais je ne comprend pas l'intéret de mettre le do while dans le switch. Si on entoure le switch à la place, qu'est-ce que ca change?


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1657973
dap++
Script kiddie
Posté le 13-12-2007 à 19:03:05  profilanswer
 

patemino a écrit :


Code :
  1. compteur = 0;
  2. while ( compteur < 10)
  3.         ++compteur;


se traduit généralement en :

Code :
  1. xor ax,ax
  2. debut:
  3.         cmp ax,10
  4.         jae fin
  5.         inc ax
  6.         jmp debut
  7. fin:


Alors qu'on pourrait simplement écrire :

Code :
  1. mov cx, 10
  2. debut:
  3.         loop debut
  4. fin:


Ce qui est drôle c'est que la version avec LOOP est plus rapide que la version DEC/JNE (ou autres JUMP selon conditions) sauf sur P4.


J'ai du mal à croire que ce message date de 2007. [:pingouino] LOOP est trop lente, il ne faut l'utiliser que si on veut optimiser pour la taille (cf. le guide d'optimisation d'Intel ou d'AMD). Par contre il vaut mieux éviter INC et DEC. Et regarde dans le manuel de ton compilateur comment activer les optimisations, tu risques d'avoir des surprises. [:doc petrus]  
 
Le chapitre 2 du guide d'AMD parle d'optimisations en C ou en C++ : http://www.amd.com/us-en/assets/co [...] /25112.PDF
Il y a ça aussi : http://agner.org/optimize/optimizing_cpp.pdf


---------------
dap.developpez.com
n°1657974
Joel F
Real men use unique_ptr
Posté le 13-12-2007 à 19:04:47  profilanswer
 

dap++ a écrit :


J'ai du mal à croire que ce message date de 2007.  


 
si tu savais comme ça me fait plaisir de lire ça  :D

n°1657977
gee
Bon ben hon
Posté le 13-12-2007 à 19:13:17  profilanswer
 

et ma question?


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1658048
djobidjoba
Posté le 14-12-2007 à 00:24:47  profilanswer
 

il y a-t-il une différence de performance ou de taille du code généré entre  

Code :
  1. if (condition==12)
  2. {
  3. resultat=1;
  4. }
  5. else
  6. {
  7. resultat=2;
  8. }


et

Code :
  1. resultat = (condition==12) ? 1 : 2;


Message édité par djobidjoba le 20-01-2008 à 12:10:24
n°1658050
djobidjoba
Posté le 14-12-2007 à 01:37:31  profilanswer
 

j'ai fait un test, c'est plus lent pour la solution 2, j'aurais cru l'inverse
sur une boucle de 10000000 executions
duree1=15625 usec
duree2=46875 usec


Message édité par djobidjoba le 20-01-2008 à 12:10:35
n°1658110
bjone
Insert booze to continue
Posté le 14-12-2007 à 10:15:01  profilanswer
 

bah regarde l'asm généré, le problème avec un bloc de code aussi petit, c'est l'entrelacement avec le code le précédent et le suivant, donc suivant ce qu'il y a autour le compilo peut générer quelque chose de légèrement différent...

n°1658466
gee
Bon ben hon
Posté le 14-12-2007 à 17:04:20  profilanswer
 

Dans ce cas pourquoi les gens préfèrent
while(n-->0)

 

à

 

while(n>0)
n--;

 

?


Message édité par gee le 14-12-2007 à 17:04:33

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1658470
bjone
Insert booze to continue
Posté le 14-12-2007 à 17:13:00  profilanswer
 

bah :??:

n°1658514
Joel F
Real men use unique_ptr
Posté le 14-12-2007 à 18:48:52  profilanswer
 

mais ca va allez vos enculages de mouches là !
Testez des trucs si minimes c'est VRAIMENT n'imp :o

n°1658516
gee
Bon ben hon
Posté le 14-12-2007 à 18:56:27  profilanswer
 

et le Duffs ? :o


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1658519
Ace17
Posté le 14-12-2007 à 19:06:37  profilanswer
 

Joel F a écrit :

mais ca va allez vos enculages de mouches là !
Testez des trucs si minimes c'est VRAIMENT n'imp :o


Carrement. Ca depend completement du compilo ainsi que du code qu'il y a autour. De toutes facons, chercher a gagner en rapidite d'execution sur ce genre de details est le meilleur moyen d'obtenir un code imbitable.

n°1658530
bjone
Insert booze to continue
Posté le 14-12-2007 à 19:30:26  profilanswer
 

gee a écrit :

et le Duffs ? :o


 
t'as raison j'ai soif, je dois avoir une despe pas trop chaude dans le coin  [:z-bob]

n°1658536
gee
Bon ben hon
Posté le 14-12-2007 à 19:36:19  profilanswer
 

:??:
 
:cry:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1658542
bjone
Insert booze to continue
Posté le 14-12-2007 à 19:52:59  profilanswer
 

http://www.youtube.com/watch?v=IYs [...] re=related
(plustôt celle là en fait)
 
duffman est immortel


Message édité par bjone le 14-12-2007 à 19:56:55
n°1663246
galileo34
Posté le 27-12-2007 à 00:58:06  profilanswer
 

A partir du moment où ton algo manipule (beaucoup) de données, c'est sur les cache-misses que tu vas perdre le plus de temps. C'est moins visible sur les CPU Intel que sur les daubes qui équipent les consoles, mais c'est quand même déterminant (les CPU Intel ont des prefetchers pour éviter les cache-miss et réordonne l'exécution des instructions pour en minimiser l'impact).
Donc, essaie de minimiser le nombre de lignes de caches utilisées (en groupant les éléments par bloc pour éviter de polluer le cache avec des données inutiles), essaie de parcourir la mémoire 'linéairement' et pas 'aléatoirement', comme ça le prefetcher fonctionnera bien. Au besoin, ajoute des instructions de prefetch si tu peux prédire suffisement à l'avance les accès mémoire.
Tu gagneras beaucoup.

n°1663271
contremait​re
Posté le 27-12-2007 à 09:33:16  profilanswer
 

et sinon, ca vaut le coup de toujours passer les variables par références plutot que par valeur? (ca evite une copie de la variable pour rien)

n°1663329
sligor
Posté le 27-12-2007 à 12:55:26  profilanswer
 

contremaitre a écrit :

et sinon, ca vaut le coup de toujours passer les variables par références plutot que par valeur? (ca evite une copie de la variable pour rien)


En dessous d'une certaine taille qui dépends des cpu (je dirais entre 8 et 32 octets), il vaut mieux passer par valeur.

n°1663456
Joel F
Real men use unique_ptr
Posté le 27-12-2007 à 18:28:25  profilanswer
 

sauf que mettre des références à des endroits bien précis aide aussi le compilateur à inliner des méthodes et fonctions plus efficacement. Typiquement, j'ai mesuré pas loin de 15% de gain entre un bon vieux
 

Code :
  1. int operator[](int idx)


 
et

Code :
  1. int operator[](const int& idx)


 
Pincettes ... compilo dependant toussa néanmoins

n°1663459
sligor
Posté le 27-12-2007 à 18:53:30  profilanswer
 

Joel F a écrit :

sauf que mettre des références à des endroits bien précis aide aussi le compilateur à inliner des méthodes et fonctions plus efficacement. Typiquement, j'ai mesuré pas loin de 15% de gain entre un bon vieux
 

Code :
  1. int operator[](int idx)


 
et

Code :
  1. int operator[](const int& idx)


 
Pincettes ... compilo dependant toussa néanmoins


pour les operateurs il y a en effet un truc, il faut que je retrouve l'article

n°1663495
Joel F
Real men use unique_ptr
Posté le 27-12-2007 à 21:31:39  profilanswer
 

sligor a écrit :


pour les operateurs il y a en effet un truc, il faut que je retrouve l'article


 
Je suis preneur de la réf.

n°1663593
Taz
bisounours-codeur
Posté le 28-12-2007 à 11:25:14  profilanswer
 

Joel F a écrit :

sauf que mettre des références à des endroits bien précis aide aussi le compilateur à inliner des méthodes et fonctions plus efficacement. Typiquement, j'ai mesuré pas loin de 15% de gain entre un bon vieux
 

Code :
  1. int operator[](int idx)


 
et

Code :
  1. int operator[](const int& idx)


 
Pincettes ... compilo dependant toussa néanmoins

ouais parce que moi j'aurais tendance à dire que la première forme génère du meilleur code et à éviter les références pour les value type de petite taille. Et j'aurais dit l'inverse, que le fais de mettre des valeurs ça lui donne plus de liberté niveau aliasing, toussa

n°1663600
tbp
Posté le 28-12-2007 à 11:43:33  profilanswer
 

D'une, si on en est à couper les cheveux en quatre, il faudra m'expliquer pourquoi l'index est signé. Ensuite pour cet opérateur je m'attarderai surtout sur le type du retour. Finalement, tout cela n'a pas grande signification hors contexte précis (compilo, révision du compilo, coefficient de marée).

n°1663646
Joel F
Real men use unique_ptr
Posté le 28-12-2007 à 13:51:01  profilanswer
 

tbp a écrit :


il faudra m'expliquer pourquoi l'index est signé.  


bah, tableau NRC style, avec des indices du styles -N à +N :o
 

tbp a écrit :


Ensuite pour cet opérateur je m'attarderai surtout sur le type du retour.  


ca manque de const et de ref je sais, c'etait pas la le pb :o
Tu va pas m'apprendre à ecrire de soperator[] hein [:dawa]
 

tbp a écrit :


Finalement, tout cela n'a pas grande signification hors contexte précis (compilo, révision du compilo, coefficient de marée).


Je l'ai dit aussi

n°1663647
Joel F
Real men use unique_ptr
Posté le 28-12-2007 à 13:51:46  profilanswer
 

Taz a écrit :

ouais parce que moi j'aurais tendance à dire que la première forme génère du meilleur code et à éviter les références pour les value type de petite taille. Et j'aurais dit l'inverse, que le fais de mettre des valeurs ça lui donne plus de liberté niveau aliasing, toussa


 
Bah pas tout le temps :| Typiquement au milieu d'une déscente récursive de types expressiont empaltes, ca enleve aps mal de code inutile.

n°2088569
Imothep14
Posté le 11-07-2011 à 09:57:56  profilanswer
 

Je répond avec une certaine connaissance de développement en C et C++.
 

Eriandel a écrit :

- L'initialisation des variables d'une fonction/méthode est-elle utile (au delà de la sécurité qu'elle peut procurer) ou un gaspillage de temps ?


Comme ddéjà dis, c'est une toute petite perte de temps pour un gain en lisibilité et en sureté du code (surtout pour les pointeurs initialisés à NULL).
 

Eriandel a écrit :

- L'allocation dynamique d'un tableau d'objet simple (int/double/char ...) est-elle plus rapide en faisant un malloc, calloc, ou un new ?


L'allocation avec un new ou un malloc prend à peu de chose près le même temps, cependant il y a deux choses à savoir :
1. Toujours utiliser le couple new/delete OU malloc/free ne surtout pas mixer les deux.
2. Dans les fonctions où la rapidité est cruciale, il faut éviter au maximum l'allocation dynamique qui ne permet pas au compilateur de prévoir l'espace mémoire nécessaire. De plus le delete va avoir ue tendance à fragmenter la mémoire et rendre l'les allocations plus lentes.
 

Eriandel a écrit :

- Les boucles for sont-elles moins rentables que les boucles whiles ?


A priori, une boucle for et aussi rapide qu'un while. Cependant, les bornes de la boucle for sont évalués à chaque passage dans la boucle est non pas au début. Il faut donc déclarer les bornes en const avant la boucle (cela évite l'aliasing mémoire).
 

Eriandel a écrit :

- Doit-on préféré les switchs au if ?


Il faut préférer les switch (lorsqu'il y a plus de 2 tests) car ils sont gérés par une table de hashage donc plus rapide d'accés.
 

Eriandel a écrit :

- Comment utilisé à bon escient l'attribut const ? [ char * / const char * / const char const * ]


Toujours mettre un const quand on peut. Cela permet de spécifier au compilateur que la variable ne sera pas modifiée est il pourra donc optimiser le code en conséquence.
 

Eriandel a écrit :

- Pour un objet (instance d'une classe) doit-on préféré un passage en paramètre par valeur, pointeur ou référence ?


Quand c'est possible, il faut utiliser un passage par référence (lisibilité + rapidité).
 
Bien sur ces optimisations ne sont à utiliser que dans les fonctions dites "critiques". La lisibilité du code est une des priorité du programmeur.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
[SQL] Structure tables MySQL pour menu de Site Web, conseilsDébuter en c# / asp.net, besoin de conseils
optimisation vba accessOptimisation d'import de gros fichiers texte dans ACCESS
Interpretation de la DTD par le navigateur ? (-> optimisation)Date et optimisation...
optimisation calcul distance dans procédure stockée ?Besoin de conseils pour organisation SQL
Optimisation d'imagesOptimisation de requétes
Plus de sujets relatifs à : Conseils et techniques d'optimisation C/C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR