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

  FORUM HardWare.fr
  Programmation

  [C++] Optimisation: rapidité d'execution?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Optimisation: rapidité d'execution?

n°32860
Elsener
Posté le 18-05-2001 à 10:41:58  profilanswer
 

Est-ce que quelqu'un connait les cycles machines approximatifs que coûtent les opérations de base du C++? Et les fonctions?
 
Y'a t'il un site web avec un récapitulatif?
 
Merci de votre réponse :)
Elsener

mood
Publicité
Posté le 18-05-2001 à 10:41:58  profilanswer
 

n°32861
tgrx
My heart is pumping for love
Posté le 18-05-2001 à 10:45:03  profilanswer
 

Ben ca depend du compilateur et du processeur... tu peux pas controler ce genre de choses...
Si vraiment tu dois ecrire une routine qui fonctionne en un nombre donne de cycles machines (comme aux temps valeureux des demomakers sur 68000), utilise l'assembleur... :)

n°32869
Elsener
Posté le 18-05-2001 à 10:53:25  profilanswer
 

Je voudrais juste savoir si un appel de fonction est quelque chose de très lourd pour le CPU :)  
 
En fait j'ai une classe avec des variables, et j'ai fait des méthodes pour changer ces variables. Donc je me demande si c'est beaucoup plus lourd que de faire des variables publiques et laisser l'utilisateur les modifier comme il le souhaite (sans passer par aucune fonction)? C'est juste pour avoir un ordre de grandeur quoi...

n°32874
verdoux
And I'm still waiting
Posté le 18-05-2001 à 11:02:34  profilanswer
 

Tu peux utiliser l'inlining pour les méthodes simples.

n°32875
tgrx
My heart is pumping for love
Posté le 18-05-2001 à 11:03:01  profilanswer
 

Un exemple :
 
class Arf
{
  int valeur;
public:
  void setValeur(int tvaleur) { valeur= tvaleur; }
  void compute();
};
 
Les fonctions definies dans la declaration de la classe (dans le .h) sont automatiquement transformees en inline. Ca veut dire que ton compilo optimisera lors de la compilation, en ne faisant pas d'appel de fonction, mais en transcrivant telle quelle la fonction au sein meme du programme.
 
Arf arf;
arf.setValeur(2);
 
sera transforme en :
Arf arf;
arf::valeur=2;
 
Et si tu veux que d'autres fonctions soient integrees en inline, il suffit de le preciser.
 
inline void Arf::compute() {}
 
Auquel cas l'appel a compute() ne fera pas l'objet d'un appel de fonction, mais le compilo fera un copier coller de sa definition au sein meme du code source.
 
Voila voila.
Et donc pour resumer, c'est aussi rapide de faire des inline que des variables globales. Donc variables globales a eviter...

 

[edit]--Message édité par tgrx--[/edit]

n°32881
n0mad
inscrit au XXe siècle
Posté le 18-05-2001 à 11:11:52  profilanswer
 

Comme l'indique tgrx, la directive INLINE permet d'inclure le code s'il n'est pas trop long.
 
Toutefois, avec les prédicteurs de branchements qu'il y a intégré dans les processeurs modernes, le cout d'un appel de fonction peut être faible par rapport au cout des paramètres à pusher sur la stack.


---------------
Pipiru piru piru pipiru pi
n°32883
BENB
100% Lux.
Posté le 18-05-2001 à 11:17:35  profilanswer
 

Verdoux a écrit a écrit :

Tu peux utiliser l'inlining pour les méthodes simples.




C'est meme ce qu'il faut faire...
1- en debug tu genere un appel facilite de debugage
2- en release ca va plus vite
 
Dans mon cas environ 30% de gagne grace a l'inline et 10 % grace aux optimisations du compilo...

n°32884
Elsener
Posté le 18-05-2001 à 11:18:01  profilanswer
 

Merciiii :)
 
Je vais faire des essais comparatifs!
On verra ce que ça donne...
 
Merci encore à tous, @ bientôt  :sol:  
 
Elsener

n°32885
tgrx
My heart is pumping for love
Posté le 18-05-2001 à 11:19:52  profilanswer
 

Il faut faire gaffe aux parametres que tu fournis aux fonctions non-inlinees.
 
Ex: void fonction(Arf arf);
 
Surtout pas ! Car a chaque appel de la fonction, le C++ va creer une copie de la classe Arf, et l'empiler, etc... ca prend enormement de temps.
-> Preferer les references et/ou les pointeurs qui ne prennent que 4 octets chacun, et c'est vite empile.
void function(Arf& arf);
void function(Arf* arf);
 
Et dans ce cas, comme l'a precise n0mad, ca devient rapide, la pile n'est pas trop surchargee.

n°32890
Elsener
Posté le 18-05-2001 à 11:34:09  profilanswer
 

Donc passer une variable int à une fonction est plus rapide par l'intermédiaire d'un pointeur?

 

[edit]--Message édité par Elsener--[/edit]

mood
Publicité
Posté le 18-05-2001 à 11:34:09  profilanswer
 

n°32891
n0mad
inscrit au XXe siècle
Posté le 18-05-2001 à 11:40:06  profilanswer
 

Elsener a écrit a écrit :

Donc passer une variable int à une fonction est plus rapide par l'intermédiaire d'un pointeur?
 




 
non, les 2 sont codés sur 32 bits, c'est pareil


---------------
Pipiru piru piru pipiru pi
n°32892
robUx4
misc coder
Posté le 18-05-2001 à 11:42:08  profilanswer
 

Non, pour les types simples ca va. C'est seulement tout ce qui est plus gros que la taille de tes registres (32 bits sur PC par ex).
 
En général, les class et les struct c'est mieux. Le reste c'est selon (éviter au max les pointeurs).

n°32900
Elsener
Posté le 18-05-2001 à 11:51:51  profilanswer
 

Oky alors je fais juste pour l'instant ;)
Tout ce qui n'est pas un type de base je le passe par référence ou par pointeur, donc pas trop de probs de ce côté là! Merci les gars pour ces précieuses infos!

n°32949
gnoof
Posté le 18-05-2001 à 13:56:20  profilanswer
 

Bon j'ai une page html très bien faite pour le pentium et+
Le problème est que je n'ai pas le nom du site sous les yeux, alors il faudra chercher.
L'auteur est "Agner Fog" le titre de la page est
"How to optimize for the Pentium family of microprocessors"

n°32950
BENB
100% Lux.
Posté le 18-05-2001 à 13:57:46  profilanswer
 

tgrx a écrit a écrit :

Il faut faire gaffe aux parametres que tu fournis aux fonctions non-inlinees.
 
Ex: void fonction(Arf arf);
 
Surtout pas ! Car a chaque appel de la fonction, le C++ va creer une copie de la classe Arf, et l'empiler, etc... ca prend enormement de temps.
-> Preferer les references et/ou les pointeurs qui ne prennent que 4 octets chacun, et c'est vite empile.
void function(Arf& arf);
void function(Arf* arf);
 
Et dans ce cas, comme l'a precise n0mad, ca devient rapide, la pile n'est pas trop surchargee.




Je ne suis pas d'accord, et je le dis...
1- premierement, il faudrait utiliser le mot cle const pour eviter de modifier la valeur (dans un passge par valeur c'est impossible, alors que la...)
 
2- void function(Arf arf) n'est pas equivalent a void function(const Arf& arf) ou a void function (const Arf *arf)...
si on passe une classe derivee de Arf a la fonction, celle-ci recois une copie de type Arf dans le premier cas, et la classe d'un type derive dans le second. d'ou difference de comportement si il y a des methodes surchargees...
 
Les modifications sont a faire en connaissance de cause.
(Bon en general c'est (const Arf& arf) que l'on souhaite)

n°32955
tgrx
My heart is pumping for love
Posté le 18-05-2001 à 14:02:53  profilanswer
 

BENB> OUI. Tu as tout a fait raison. :hello:
 
Je decrivais juste de maniere tres basique comment faire pour optimiser du code source, et eviter de perdre betement des cycles machines... (sic)
 
Maintenant si on rentre dans le detail... evidemment & != *
Mais je ne crois pas que c'etait le but du topic.

n°32965
wpk
Posté le 18-05-2001 à 14:13:48  profilanswer
 

Une petite remarque sur le post:
 
L'optimisation de ton code, fais la a la fin du developpement.
Si t'as mis les pieds dans l'objet, c'est pas la peine de tout saloper a vouloir optimiser le code des le debut. Il faut surtout respecter d'abord la clarte du code et le modele objet. Ensuite seulement doivent venir les questions existentielles sur l'optimisation du code. Tu utilise pour ca des outils de monitoring. En general, moins de 10% du code utilise 90% du temps CPU. C'est donc pas la peine de compliquer inutilement le reste.  
 
L'argument qui consiste par exemple a dire que toute recopie est proscrite est a prendre avec des pincettes (des fois, la recopie d'un objet est indispensable et vouloir ruser a tout prix pour grapiller ca et la un cycle d'horloge donne du code inutilisable par la suite.)

n°32969
BENB
100% Lux.
Posté le 18-05-2001 à 14:25:24  profilanswer
 

tgrx a écrit a écrit :

BENB> OUI. Tu as tout a fait raison. :hello:
 
....
 
Maintenant si on rentre dans le detail... evidemment & != *
Mais je ne crois pas que c'etait le but du topic.




 
La difference entre * et & est philosophique :D mais importante
Par contre la difference entre (Arf) et (const Arf &) lors d'un passge d'argument est suffisement importante pour etre signalee a quelqu'un qui on conseille de changer l'un pour l'autre !
Le comprtement du proramme peut en etre affecte...

n°33136
BifaceMcLe​OD
The HighGlandeur
Posté le 18-05-2001 à 18:54:25  profilanswer
 

wpk>  :jap: C'est très juste, et malheureusement trop souvent oublié ou ignoré.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] Optimisation: rapidité d'execution?

 

Sujets relatifs
[VBA] création d'un control pendant l'exécution (access2k)Optimisation de Cd-R
[Sql server Sybase] Bloquer exécution proc stockée sur host name[C] plantage à l'execution
sql_oracle8: OptimisationFaire une pause dans l'éxécution d'une boucle en C++ ?
Comment casser l'éxécution d'une boucle en C++ ?[mysql] optimisation
Comment connaitre le temp d'éxécution d'une boucle en C++ ?[MYSQL] Un peu d'optimisation
Plus de sujets relatifs à : [C++] Optimisation: rapidité d'execution?


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