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

 


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

Conseils et techniques d'optimisation C/C++

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

Reprise du message précédent :
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 11-07-2011 à 09:57:56  profilanswer
 

n°2088594
theshockwa​ve
I work at a firm named Koslow
Posté le 11-07-2011 à 10:56:16  profilanswer
 

Imothep14 a écrit :

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


ca mérite une pelle d'or, de sortir un topic où la dernière intervention date de 2007
 

Imothep14 a écrit :


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.


la différence entre malloc et new vient surtout de l'appel aux constructeurs des divers éléments de ton tableau. Pour les types non primitifs, ca peut coûter cher, et, suivant les cas d'utilisation, on va vouloir faire les initialisations à un autre moment (cas de la mémoire allouée via un reserve dans un vector, par exemple)
 

Imothep14 a écrit :


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).


C'est pas seulement pour un problème d'alisaing qu'on sort les calculs de bornes : suivant les cas, on va vouloir éviter de réévaluer des appels de fonction potentiellement couteux.
 

Imothep14 a écrit :


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.


hashtable != jumptable. Mais dans l'idée, c'est ca
 

Imothep14 a écrit :


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.


Y'a pas d'optim sur la constness, c'est juste de la propreté (rien ne t'empêche de virer un const dans ton code plus loin avec un const_cast)
 

Imothep14 a écrit :


Quand c'est possible, il faut utiliser un passage par référence (lisibilité + rapidité).


Il y a des cas où ca peut avoir du sens de passer une instance par valeur, tout dépend du contexte.
 

Imothep14 a écrit :


Bien sur ces optimisations ne sont à utiliser que dans les fonctions dites "critiques". La lisibilité du code est une des priorité du programmeur.


Là, il est plus question de généralité, rien qui nuise vraiment à la lisibilité, on n'est en fait même pas vraiemnt dans des questions d'optimisations mais plutôt de bonnes pratiques.


---------------
last.fm
n°2091643
persev4
Posté le 27-07-2011 à 02:24:24  profilanswer
 

bonjour à tous,
on va peut-être penser que c'est opportuniste de poster cette question ici..
je commence le C++ et ai seulement le mois d'Août pour arriver à un bon niveau..
 
Pourriez-vous me conseiller sur la façon de procéder pour progresser assez rapidement sur ce mois d'Août..
 
Merci d'avance!

n°2091703
theshockwa​ve
I work at a firm named Koslow
Posté le 27-07-2011 à 11:05:22  profilanswer
 

Ne sachant pas quelels bases tu as sur la programmation en général et sur les questions d'architectures, ca va être dur de t'orienter.
En tout cas, en un mois, tu pourras peut-être être opérationnel, mais pour avoir un "bon niveau", ca va sans doute prendre un peu plus de temps ...
 
Commence donc par nous dire ce que tu connais déjà (C ? Java ?) et par jeter un oeil aux bibliolinks (dans le topic qui va bien), tu y trouveras des sites et livres pour apprendre.


---------------
last.fm
n°2093670
Glock 17Pr​o
Posté le 06-08-2011 à 17:09:24  profilanswer
 

y a encore des avantages sur une appli desktop de passer par de l'assembleur intégré ?


---------------
.
n°2093714
Joel F
Real men use unique_ptr
Posté le 06-08-2011 à 21:13:55  profilanswer
 

non

n°2093729
Glock 17Pr​o
Posté le 06-08-2011 à 23:23:09  profilanswer
 

c'était plus fun avant :'(


---------------
.
n°2093763
Joel F
Real men use unique_ptr
Posté le 07-08-2011 à 08:24:16  profilanswer
 

si apr fun tu entends inmaintenable, pas portable et totalement contre-productif, oui ...

n°2093774
Glock 17Pr​o
Posté le 07-08-2011 à 11:28:20  profilanswer
 

ué enfin si par exemple tu veux faire du circular shift je suis pas sûr que le code C soit plus productif/maintenable que l'appel à la routine en ASM...


---------------
.
n°2093776
Joel F
Real men use unique_ptr
Posté le 07-08-2011 à 11:57:54  profilanswer
 

tu veux dire que ton asm il est compiler et processor independant peut etre ...

mood
Publicité
Posté le 07-08-2011 à 11:57:54  profilanswer
 

n°2093780
Glock 17Pr​o
Posté le 07-08-2011 à 12:32:08  profilanswer
 

oui en encapsulant ça dans une lib à la boost et hop


---------------
.
n°2093781
Joel F
Real men use unique_ptr
Posté le 07-08-2011 à 12:50:10  profilanswer
 

et pourquoi pas faire pareil avec la version  C++ directement :E, c'est juste que tu veux avoir l'air intelligent ou y a une vraie raison ? :o

n°2093783
Glock 17Pr​o
Posté le 07-08-2011 à 13:10:37  profilanswer
 

la vraie raison c'est que de passer par le C tu fais le postulat que ton compilateur te traduira bien le code C par l'ASM qui va bien dans le cas du circular shift...ce qui n'est hélas pas toujours le cas


---------------
.
n°2093784
Joel F
Real men use unique_ptr
Posté le 07-08-2011 à 13:21:23  profilanswer
 

c'est pas ton probleme. tu te preoccuperas de ca si et seulement si tes specs de performances ne sont pas atteintes. ET franchement, le circluar shift, ca doit faire parti des trucs qui 1/ sont resolus dans la strength reduction pass 2/ sont dispo sous forme d'intrinsinc C.

n°2094330
Glock 17Pr​o
Posté le 10-08-2011 à 00:37:42  profilanswer
 

oui mais comment tu fais si tu veux tester les flags du FPU par exemple ?


---------------
.
n°2094346
Joel F
Real men use unique_ptr
Posté le 10-08-2011 à 08:21:28  profilanswer
 

y a ce qu'il faut snas passer par de l'asm que se soi sous gcc ou MSVC.
Le seul truc ou j'ai encore de l'asm, c'est pour rdtsc et encore, pas partout.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

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