# aide sur programme



## mator (9 Octobre 2007)

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


----------



## steiner (9 Octobre 2007)

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


----------



## Céroce (10 Octobre 2007)

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.


----------



## p4bl0 (10 Octobre 2007)

En plus des conseils qu'on viens de te donner, je te conseillerais d'utiliser un compilateur r&#233;cent (gcc4 par exemple) plut&#244;t qu'un vieux qui date de 15 ans, &#231;a peut pas faire de mal (m&#234;me si l'executable ne sera peut-&#234;tre pas plus rapide).


Sinon je pense que C est un des langage qui g&#233;n&#232;re les executable les plus rapide &#224; part l'assembleur directement. J'en suis pas s&#251;r et certains &#224; 100&#37; mais presque.
En tout cas c'est forc&#233;ment plus rapide qu'un langage interpr&#233;t&#233; ou qu'un langage type java ou les executable sont lancer dans une vm.


----------



## Didier Guillion (10 Octobre 2007)

Bonsoir,

Essaie de compiler ton code sous XCode, puis lance le en utilisant Shark (fourni avec le CD), il te montrera les portions de code qui prennent le plus de temps et donc à optimiser.
Shark te donne meme des suggestions pour l'optimisation.

Cordialement


----------



## Céroce (11 Octobre 2007)

C'est une bonne voie, Didier, mais je crois que c'est à faire dans un second temps. S'il veut que ça tourne 10 x plus vite, il va falloir repenser l'algorithme avant tout.


----------



## Didier Guillion (11 Octobre 2007)

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


----------



## GrandGibus (11 Octobre 2007)

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?


----------



## Céroce (12 Octobre 2007)

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


----------



## molgow (12 Octobre 2007)

p4bl0 a dit:


> 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!


----------



## p4bl0 (12 Octobre 2007)

molgow a dit:


> ... 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 &#231;a 

J'avais d&#233;j&#224; entendu parl&#233; de JIT compilation avec Perl, mais je ne savais pas que d'autre truc utilisaient &#231;a


----------



## Didier Guillion (13 Octobre 2007)

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


----------



## p4bl0 (13 Octobre 2007)

Didier Guillion a dit:


> Heuu Molgow, tu me s&#232;me l&#224;...
> 
> Le lien que tu donne c'est pour r&#233;pondre &#224; 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.
> ...


En bas du lien wikip&#233;dia de molgow :

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


----------



## mator (17 Octobre 2007)

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+


----------



## Didier Guillion (18 Octobre 2007)

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


----------



## molgow (18 Octobre 2007)

Didier Guillion a dit:


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



Oui c'était pour digresser sur Java.


----------



## Céroce (18 Octobre 2007)

mator a dit:


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


----------



## GrandGibus (18 Octobre 2007)

mator a dit:


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




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


----------



## ntx (19 Octobre 2007)

GrandGibus a dit:


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


Voir un petit coup d'Altivec pour faire les comparaisons 4 par 4.
Il faudrait avoir accès au code pour t'aider sur les optimisations possibles.


----------



## mator (20 Octobre 2007)

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


----------



## ntx (21 Octobre 2007)

Ouille, ce que tu nous livres l&#224; est l'exemple m&#234;me de tout ce qu'il ne faut pas faire pour avoir un code propre :
- pas une ligne de commentaire
- de noms de variables "anonyme", pas moyen de conna&#238;tre leur r&#244;le
- aucune indentation (d&#251; &#224; ta conversion en doc ?)
- des "goto" dans tous les sens qui donne l'impression que ce code est &#233;t&#233; traduit directement &#224; partir d'un autre langage (basic ???)

C'est un truc &#224; s'arracher les cheveux :rateau: Mais cela ne nuit que moyennement aux performances. 
Donc &#224; premi&#232;re vu, je passerai d&#233;j&#224; par une recompilation de ton code avec Xcode pour partir sur des bases neuves, et pas un ex&#233;cutable qui a 15 ans.
Ensuite, j'envisagerai une gestion un peu plus dynamique de la m&#233;moire ce qui limitera sa consommation (allocation dynamique des tableaux) ainsi qu'une navigation dans les tableaux &#224; l'aide de pointeurs.

Mais pour en revenir &#224; ta question de d&#233;part, le C est tout &#224; fait adapt&#233; &#224; ce genre de programme et tu ne feras mieux qu'avec une programmation en assembleur.


----------



## p4bl0 (21 Octobre 2007)

xkcd - goto​


----------



## GrandGibus (21 Octobre 2007)

De ma comprehension, selon tes explications et sans avoir ouvert ton .doc: 

la complexit&#233; du code est lin&#233;aire
les optimisations n'auront qu'un impact minime
le moyen le plus simple d'optimiser 'r&#233;ellement' passera par du multi threading

Apr&#232;s, si j'avais &#224; le re-&#233;crire, peut-&#234;tre que je lorgnerais du cot&#233; de

Java pour la gestion ais&#233;e des Thread
JRules (ou autre moteur de r&#232;gle) pour t'adapter facilement aux &#233;volutions de ton programme

Sinon, dans quel domaine s'applique ton programme ? Pour qui c'est (un organisme d'&#233;tat, priv&#233;?...) ?


----------



## Didier Guillion (21 Octobre 2007)

GrandGibus a dit:


> De ma comprehension, selon tes explications et sans avoir ouvert ton .doc:
> 
> la complexité du code est linéaire
> les optimisations n'auront qu'un impact minime
> le moyen le plus simple d'optimiser 'réellement' passera par du multi threading



Sincerement, et meme si tu as dans le fond raison, pense tu qu'orienter un débutant total vers le multi thread n'est pas le meilleur moyen de le mettre dans une impasse ?

Cordialement


----------



## GrandGibus (21 Octobre 2007)

Didier Guillion a dit:


> Sincerement, et meme si tu as dans le fond raison, pense tu qu'orienter un débutant total vers le multi thread n'est pas le meilleur moyen de le mettre dans une impasse ?
> 
> Cordialement



*Tu n'as pas entièrement tort ... *

Mais avec un minimum d'encadrement ça devrait le faire ! Je n'ai pas l'impression que cela se révèle d'une complexité extrème... si on reste à paralèlliser au niveau de la comparaison des séries... La mise en place peut être réalisée que dans un second temps. De plus, le gain peut s'avérer réellement significatif... 

C'est également pour cette raison que je lui demande pour quel domaine d'application son programme est destiné... ça pourrait réveiller des vocations, qui sait !


----------



## ntx (21 Octobre 2007)

GrandGibus a dit:


> De ma comprehension, selon tes explications et sans avoir ouvert ton .doc


Jettes y un coup d'oeil, tu ne seras pas déçu


----------



## molgow (27 Octobre 2007)

GrandGibus a dit:


> le moyen le plus simple d'optimiser 'réellement' passera par du multi threading



Je ne comprends pas comment du multi-threading peut augmenter les performances sur des traitements qui ne nécessite à priori jamais d'attente passive ? À moins que tu veuilles parler de parallélisation ?


----------



## GrandGibus (27 Octobre 2007)

molgow a dit:


> Je ne comprends pas comment du multi-threading peut augmenter les performances sur des traitements qui ne n&#233;cessite &#224; priori jamais d'attente passive ? &#192; moins que tu veuilles parler de parall&#233;lisation ?



Oui, tout &#224; fait: tu parall&#232;lises en faisant plusieurs thread.


@NTX, le coeur m'en dirait bien, mais suis vraiment overbook&#233; en ce moment... Par contre, c'est tout &#224; fait le genre de petit algo prise de t&#234;te que j'affectionne ...


----------



## Céroce (29 Octobre 2007)

mator a dit:


> 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 :



Bon, je n'ai pas vraiment décortiqué ton programme, mais ce que je peux te dire, c'est que c'est du C tout ce qu'il y a de plus standard. Avant de considérer toute autre option:
- installe XCode (je suppose que tu utilises Mac OS X; c'est livré sur le disque d'installation)
- Crée un nouveau projet (File > New project) de type Standard Tool.
- Double-clique le fichier .c présent et remplace son contenu par ton code.
- Lance le programme (Pomme-R)

Et vois si les performances te conviennent!


----------

