-
Rapidité d'un programme
Bonjour,
Je code des applications scientifiques en langage C. En général la longeur de l'execution des programmes demandent une rigueur dans l'algorithme. Mais je me pose cette question :
Est ce que la rapidité d'un programme va dépendre d'autre chose que de son algorithme : par exemple du compilateur?
-
Je dirais que la rapidité d'un programme dépend de 4 facteurs
- En 1er, l'algorithme. Un bon algorithme va toujours plus vite qu'un mauvais algorithme. J'enfonce des portes ouvertes en disant cela mais il me semble que c'est primordiale. Si on aborde la multiplaction de grands nombres sans connaitre l'algorithme de la multiplication rapide, c'est mal parti pour avoir un truc performant.
- En 2nd, je dirais la compétence du développeur qui va implémenter l'algorithme. En effet, passer des std::string par valeur au lieu de les passer par référence peut avoir un impact non négligeable au final (de même que d'utiliser std::vector au lieu de std::list ou l'inverse dans un contexte particulier).
- En 3eme, je mettrai les performances pures de la machine. Il est clair qu'un programme est plus performant sur une machine à 2 Ghz avec 4 GO de RAM que le même programme sur un PIII à 433MHZ avec 128Mo de RAM.
- Et enfin, je dirais les performances du compilateur ou plutôt de son optimiseur de code. Mais je pense que ce point est vraiment le dernier à prendre en compte.
-
Une fois que l'on a optimisé le code, que l'on utilise des machines puissantes. Est ce que je peux accélérer mon processus, en fonction du compilateur et quelle gain de temps en plus des options d'optimisation
-
ça dépend beaucoup des applis.
De plus, à partir du flag -O3 commencent à arriver des problèmes (fonctions non correctes, sorties incohérentes, problèmes mémoires, etc etc).
-O2 est le max que j'ai utilisé.. Mais par exemple ne marche pas pour ce qui touche à la décompression au vol des mpegs..
Cependant, une optimisation du code peut être faite assez souvent qui peut faire grignoter des %, voire même gagner des facteurs du simple au double (faire les calculs d'une autre manière, calculer une seule fois l'adresse où une valeur sera mise et non pas se référer toujours à tab[i+dim1*j], etc etc... vérifier les ordres dans les boucles,...)
Fondamentalement, sinon, ce serait être multi-processeurs et faire du parallèlisme.. Si c'est faisable. Mais uniquement une fois que tout le reste est fait..
-
je te remercie de ta réponse connais tu des tutoriaux qui expliquent, qui listent des astuces, permettant de gagner du temps.
Merci de vos réponses?
-
je n'en connais pas vraiment..
Soit c'est orienté machine (paramètrages), soit c'est trop général.
Pour les options, voir les man pages de gcc.
Sinon de manière générale toute optimisation est dépendante de ce que l'on souhaite : optimiser mémoire, vitesse, les 2, continuer à garantir la lisibilité, etc etc..
C'est du cas par cas..
Par contre, une fois que tu l'as fais (ou vu faire) une fois, tu commences à connaître certains trucs.
Il faudrait un exemple pour montrer..