aide sur programme

mator

Membre confirmé
21 Octobre 2004
92
0
54
Bonjour,

J'ai écrit un programme en C(pas très orthodoxe) avec un vieux logiciel que j'ai depuis 15 ans.
Il tourne parfaitement sur mon Mac G4 mais il est très lent.
J'aimerai savoir, à part de changer de micro, si il est possible de faire que ce programme tourne
10 ou 100 fois plus vite en changeant de langage et si oui comment le réaliser.

merci
 
Bah il faudrait optimiser ton codage.
Faut voir la complexité de ton algo et essayer de la réduire pour minimiser le nombre d'opérations et également essayer de faire des opérations plus simples : additions et soustractions plutot que * et / ; ansi que privilégié la table par 2
Mais bon je fais pas de C donc :s
 
Tu peux peut-être accélérer ton programme, en réécrivant certaines parties en "langage d'assemblage", mais:
- tu ne peux guère espérer un gain supérieur à 2
- il faut être un expert
- ton code ne sera plus très portable, par exemple, il sera impossible de le faire tourner en natif sur un processeur Intel et un processeur PowerPC.


La meilleure option est celle préconisée par steiner: étudie ton programme et modifie les algorithmes utilisés. Selon ton programme tu peux peut-être atteindre les gains espérés. Il faut que nous sachions précisément comment il est codé pour pouvoir te guider.
 
En plus des conseils qu'on viens de te donner, je te conseillerais d'utiliser un compilateur récent (gcc4 par exemple) plutôt qu'un vieux qui date de 15 ans, ça peut pas faire de mal (même si l'executable ne sera peut-être pas plus rapide).


Sinon je pense que C est un des langage qui génère les executable les plus rapide à part l'assembleur directement. J'en suis pas sûr et certains à 100% mais presque.
En tout cas c'est forcément plus rapide qu'un langage interprété ou qu'un langage type java ou les executable sont lancer dans une vm.
 
Oui, Ceroce, mais d'apres ce que j'ai rencontré dans mes projets, l'assembleur s'est efficace (mes premiers programmes etaient 100% assembleur) mais c'est long et lourd a mettre en oeuvre, Shark te permet de savoir ou passe le temps machine et qu'elles fonctions il peut etre interessant à optimiser. Si chaque routine prends 2-5 % c'est sur il faut repenser l'algorithme, mais si tu voit qu'une portion de code te prends 80% du temps machine, la reecrire en assembleur sera efficace.

De plus, certaines options de compilation du code C (par exemple le Relax IEE Compliance ou Unroll lopps) entrainent parfois des surprises...

Cordialement
 
Tout d'abord, quitte à dire des évidences: si un langage était 10 voire 100 fois plus rapide qu'un autre, cela se saurait depuis longtemps !

Ceci dit, je ne crois pas que "le simple fait" de changer de langage te fera gagner un tel facteur de performance.

Mais de là à proner un changement radical de conception, il y a un pas que... je ne franchirai pas de suite. Tout comme Didier, je prendrai tout d'abord la voie de Shark. Très simple d'utilisation, il te permettra de détecter "les zones" à améliorer.

Sans remettre la conception en cause, peut-être que l'ajout d'un simple cache pourra faire des miracles...

Et alors, et seulement alors.... tu pourras envisager la re-écriture...


P.S. @p4blo essaies de faire une fibbonacci de 50 en Java et en C++... t'as quelle différence? ;)
 
Je suis d'accord que Shark est un outil intéressant, mais là, vue la question, ça me parait sortir l'artillerie lourde alors qu'il y a peut-être des optimisations évidentes (pour nous, programmeurs expérimentés) qui donneront un vrai gain, sans compromettre la portabilité.

J'insiste sur ce dernier point, parce que si le programme tourne depuis 15 ans, il pourra le faire encore 15, et dieu sait que l'optimisation est souvent l'ennemie de la portabilité.
 
Sinon je pense que C est un des langage qui génère les executable les plus rapide à part l'assembleur directement. J'en suis pas sûr et certains à 100% mais presque.
En tout cas c'est forcément plus rapide qu'un langage interprété ou qu'un langage type java ou les executable sont lancer dans une vm.

... Just-in-time compilation ! ;)

Il y a beaucoup d'optimisation que tu peux faire à l'exécution plutôt qu'à la compilation!

L'exemple c'est du code Java (J2EE) qui tourne en permanance et pendant très longtemps sur un serveur, avec une machine virtuelle qui fait du Just-in-time compilation, tu pourras optimiser encore mieux qu'à la compilation statique!
 
... Just-in-time compilation ! ;)

Il y a beaucoup d'optimisation que tu peux faire à l'exécution plutôt qu'à la compilation!

L'exemple c'est du code Java (J2EE) qui tourne en permanance et pendant très longtemps sur un serveur, avec une machine virtuelle qui fait du Just-in-time compilation, tu pourras optimiser encore mieux qu'à la compilation statique!
:) J'vais aller lire ça :zen:

J'avais déjà entendu parlé de JIT compilation avec Perl, mais je ne savais pas que d'autre truc utilisaient ça :)
 
Heuu Molgow, tu me sème là...

Le lien que tu donne c'est pour répondre à la digression sur le Java, c'est ca ?
Je ne pense pas que ceci fonctionne sur un programme C (question de mator) qui lui est toujours fourni en langage machine.

Cordialement
En bas du lien wikipédia de molgow :

http://www.gnu.org/software/lightning/
C'est pas tout à fait la même chose, mais ça s'en rapproche un peu non ? "GNU lightning is a library that generates assembly language code at run-time"

:)
 
Bonjour et merci pour les réponses.

Je vous avoue que les réponses me dépassent dans le sens ou j'ai écrit ce programme pour une personne, mais je suis novice et il y a sans doute des améliorations à faire sur l'algo et sur l'optimisation à votre niveau de programmation.

Je précise que le logiciel s'appelle Think C et que le programme compare un ensemble de séries de chiffres à une base composée aussi de séries de chiffres suivant 2 critères très simples.
Mais comme il y a beaucoup de séries c'est très très long.

A+
 
Bonjour Mator,

Il est difficile de te dire comment améliorer un programme si tu n'explique pas précisemment ce que tu y fait dedant. A la limite, fourni les sources...
Mais en aveugle, comme Think C était mon compilateur avant que je ne passe à CodeWarrior, il me semble me souvenir que Think C ne générait pas de code PPC mais du code 68k. Donc, deja le recompiler avec un compilateur plus récent et genérer du code PPC devrait l'accélérer pas mal.


Cordialement
 
Heuu Molgow, tu me sème là...

Le lien que tu donne c'est pour répondre à la digression sur le Java, c'est ca ?
Je ne pense pas que ceci fonctionne sur un programme C (question de mator) qui lui est toujours fourni en langage machine.

Cordialement

Oui c'était pour digresser sur Java. ;)
 
Je précise que le logiciel s'appelle Think C et que le programme compare un ensemble de séries de chiffres à une base composée aussi de séries de chiffres suivant 2 critères très simples.
Mais comme il y a beaucoup de séries c'est très très long.

Commence par faire ce que viens de te conseiller Didier: installe les Developer Tools sur ton Mac et recompile ton programme avec xCode. Tu peux espérer, au minimum, doubler la vitesse d'exécution!

Ensuite, poste ton code ici (à moins que ce ne soit un secret industriel ultra-confidentiel) et nous te donnerons des astuces pour améliorer tes algorithmes.
 
Bonjour et merci pour les réponses.

Je vous avoue que les réponses me dépassent dans le sens ou j'ai écrit ce programme pour une personne, mais je suis novice et il y a sans doute des améliorations à faire sur l'algo et sur l'optimisation à votre niveau de programmation.

Je précise que le logiciel s'appelle Think C et que le programme compare un ensemble de séries de chiffres à une base composée aussi de séries de chiffres suivant 2 critères très simples.
Mais comme il y a beaucoup de séries c'est très très long.

A+


Vu comme ça, t'as essayé le multi-threading ?
 
Bonjour,

Je prefere mettre le programme en pièce jointe pour ne pas encombrer.
Je veux juste préciser que je ne connais pas le but final du programme mais l'explication en est la suivante :

On a un fichier "base" avec pour l'instant 97 series, chacune composée de 10 chiffres allant de 1 à 50.

On va alors comparer toutes les séries de 10 chiffres allant de 1 à 50 avec le fichier base contenant pour l'instant 97 séries.

Et tout cela suivant 1 critère qui est que l'on ne garde dans le fichier "possib9" que les séries ayant 1 fois 4 numéros en commun entre l'ensemble des séries et la base.

Tout cela évoluant au fur et à mesure :
-La base va grossir
-Le critère sera 2 fois 4 numéros en commun, 3 fois 4 numéros en commun etc...
-Le critère sera 1 fois 5 numéros en commun etc...

Voila pour l'explication

Merci