 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Xandros Guest
|
Posted: Thu Aug 04, 2005 6:29 pm Post subject: Temps de compilation avec C++ sous Linux ? |
|
|
Bonjour,
Je veux me mettre au C++, j'ai donc acheter un livre sur le C++ (ça
aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre de "Hello
World". ça met 3 secondes à compiler et 2 secondes à construire ! je
trouve ça un peu long ? non ?
Le jour où je vais avoir un programme de 1000 lignes, ça va mettre 300
secondes (soit 5 minutes) à compiler + 200 secondes (soit 3 minutes 30)
à construire ? si il faut attendre 8 minutes 30 pour savoir si y a un ug !!!
J'ai bidouillé un peu sous VB et delphi sous Windows et la compilation,
même pour des programmes de + de 1000 lignes était presque instantané.
Alors, y a un bug ? ou bien c'est normal ?
Merci
--
Message envoyé avec Thunderbird
Sous Linux Xandros 3.0 Deluxe
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Aug 04, 2005 6:48 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Xandros a écrit :
| Quote: | Bonjour,
Je veux me mettre au C++, j'ai donc acheter un livre sur le C++ (ça
aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre de "Hello
World". ça met 3 secondes à compiler et 2 secondes à construire ! je
trouve ça un peu long ? non ?
|
Un test intéressant et de ne faire tourner que le préprocesseur sur ton
programme. La dernière fois que j'ai regardé, j'obtenais sous VC++ un
fichier d'environ 600 000 lignes, dont 3 à moi...
| Quote: | Le jour où je vais avoir un programme de 1000 lignes, ça va mettre 300
secondes (soit 5 minutes) à compiler + 200 secondes (soit 3 minutes 30)
à construire ? si il faut attendre 8 minutes 30 pour savoir si y a un ug
!!!
|
Qui te fait croire que c'est linéaire ? As-tu fait un programme qui
affiche 2 fois hello world et vu qu'il durait 10s à compiler ?
Le temps de compilation peu devenir un problème, mais je pense que tu en
est bien loin.
| Quote: | J'ai bidouillé un peu sous VB et delphi sous Windows et la compilation,
même pour des programmes de + de 1000 lignes était presque instantané.
|
Le mécanisme d'inclusion est je crois assez différent. Ce qui peut
expliquer beaucoup.
--
Loïc
|
|
| Back to top |
|
 |
noone@nowhere.com Guest
|
Posted: Thu Aug 04, 2005 6:49 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Xandros a écrit :
| Quote: | Bonjour,
Je veux me mettre au C++, j'ai donc acheter un livre sur le C++ (ça
aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre de "Hello
World". ça met 3 secondes à compiler et 2 secondes à construire ! je
trouve ça un peu long ? non ?
Le jour où je vais avoir un programme de 1000 lignes, ça va mettre 300
secondes (soit 5 minutes) à compiler + 200 secondes (soit 3 minutes 30)
à construire ? si il faut attendre 8 minutes 30 pour savoir si y a un ug
!!!
J'ai bidouillé un peu sous VB et delphi sous Windows et la compilation,
même pour des programmes de + de 1000 lignes était presque instantané.
Alors, y a un bug ? ou bien c'est normal ?
Merci
|
si tu veux compiler en ligne de commande tu tapes
g++ ton_fichier.cc -o ton_executable
En fait Anjuta utilises les Autotools (Autoconf, Automake, etc...)
c'est à dire un ensemble de scripts dont l'objectif est entre autre de
ne pas avoir à recompiler des morceaux que tu as déjà compilé (voir
compilation séparée avec l'option -c, utilisation d'un Makefile, etc...)
donc ça n'a rien d'anormal... et ça ne veux pas dire que ça mettra
BEAUCOUP plus de temps pour un programme plus long...
De la doc sur GNU Make et le Makefile
info make
http://gl.developpez.com/tutoriel/outil/makefile/
De la doc sur les Autotools (dans un deuxième temps seulement)
http://www.laas.fr/~sjoyeux/doc/autotools-cours.pdf
Personnellement je te conseille déjà de regarder comment faire un
Makefile basique !
|
|
| Back to top |
|
 |
noone@nowhere.com Guest
|
Posted: Thu Aug 04, 2005 6:52 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
| Quote: | Personnellement je te conseille déjà de regarder comment faire un
Makefile basique !
|
j'oubliai de dire... savoir faire un Makefile ne sert pas qu'en
programmation... j'en utilise pour faire mes cours avec LaTeX
donc laisse vite tomber ton IDE et passe à un éditeur de texte (Emacs,
XEmacs, vi, etc...) comme ça tu comprendras un peu plus le mécanisme...
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Aug 05, 2005 7:08 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
[email]noone (AT) nowhere (DOT) com[/email] wrote:
| Quote: | Personnellement je te conseille déjà de regarder comment
faire un Makefile basique !
j'oubliai de dire... savoir faire un Makefile ne sert pas
qu'en programmation... j'en utilise pour faire mes cours avec
LaTeX
|
Tout à fait. Les makefile pour LaTeX, d'ailleurs, sont assez
particuliers, étant donné que parfois, il faut invoquer LaTeX
plusieurs fois sur la même source pour avoir le bon résultat.
(LaTeX se sert des résultats de la fois avant pour résoudre les
références en avant. Alors, si le numéro de page où se trouve
l'étiquette change, la référence est fausse ; il le signale, et
il faut l'invoquer de nouveau.)
Les make, malheureusement, varient énormement, et écrire un
fichier de make portable est encore plus difficile que d'écrire
du C++ portable. Le make de GNU, d'ailleurs, est un langage en
soit, avec des boucles, des conditionnels...
| Quote: | donc laisse vite tomber ton IDE et passe à un éditeur de texte
(Emacs, XEmacs, vi, etc...) comme ça tu comprendras un peu
plus le mécanisme...
|
Chaque chose dans son temps, j'imagine. Mais c'est vrai qu'on
peut apprendre à faire des make simples sans trop d'effort.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Aug 05, 2005 7:23 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Loïc Joly wrote:
| Quote: | Xandros a écrit :
Je veux me mettre au C++, j'ai donc acheter un livre sur le
C++ (ça aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une
vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre
de "Hello World". ça met 3 secondes à compiler et 2 secondes
à construire ! je trouve ça un peu long ? non ?
Un test intéressant et de ne faire tourner que le
préprocesseur sur ton programme. La dernière fois que j'ai
regardé, j'obtenais sous VC++ un fichier d'environ 600 000
lignes, dont 3 à moi...
|
C'est l'effet d'avoir rendu les iostream des templates. C'est
notable : quelque soit le compilateur, quand on passe de
l'ancienne version des iostream à la nouvelle, les temps de
compile auguement énormement.
Dans ma bibliothèque, la vaste majorité des fichiers n'utilise
pas les iostream. Et ça compile, sur une machine comme la
sienne, très, très vite.
Un autre phénomène que j'ai constaté, aussi bien sous Linux que
sous Solaris : la première fois que tu invoques le compilateur,
il est assez lent. Ensuite, à condition d'avoir assez de
mémoire, il reste résident en mémoire, et s'invoque beaucoup,
beaucoup plus vite. (Ce qui n'est pas désagréable quand on
récompile une bibliothèque avec environs 700 fichiers source.)
| Quote: | Le jour où je vais avoir un programme de 1000 lignes, ça va
mettre 300 secondes (soit 5 minutes) à compiler + 200
secondes (soit 3 minutes 30) à construire ? si il faut
attendre 8 minutes 30 pour savoir si y a un ug !!!
Qui te fait croire que c'est linéaire ? As-tu fait un
programme qui affiche 2 fois hello world et vu qu'il durait
10s à compiler ?
Le temps de compilation peu devenir un problème, mais je pense
que tu en est bien loin.
J'ai bidouillé un peu sous VB et delphi sous Windows et la
compilation, même pour des programmes de + de 1000 lignes
était presque instantané.
Le mécanisme d'inclusion est je crois assez différent. Ce qui
peut expliquer beaucoup.
|
En partie. Et surtout pour les petits programmes. Pour une
petite compilation comme la sienne, la facteur limitante est la
bande passante des accès disques. Mettre une disque SCSI, par
exemple, améliorera les choses notablement.
Quand on compile un projet complet, avec beaucoup de fichiers
source, et qu'on a assez de mémoire (c'est son cas), Unix arrive
assez bien à garder les secteurs cachés en mémoire. Du coup, la
bande passante du disque joue pour la compilation de la première
module, mais ensuite, c'est d'une rapidité étonnante. (Tant
qu'on est sur les disques locaux, évidemment.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Fri Aug 05, 2005 8:19 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: | Les make, malheureusement, varient énormement, et écrire un
fichier de make portable est encore plus difficile que d'écrire
du C++ portable. Le make de GNU, d'ailleurs, est un langage en
soit, avec des boucles, des conditionnels...
|
Et malheureusement, on rencontre très souvent des Makefile
écrits de façon non optimale, ce qui empêche make de faire
son boulot correctement et oblige de faire des "clean" régulièrement
si on veut vraiment être sûr que tout est régénéré comme il faut.
Voir "Recursive Make Considered Harmful",
<http://www.canb.auug.org.au/~millerp/rmch/recu-make-cons-harm.html>
Une alternative intéressante pour le C++ semble le "jam" qui est
utilisé par exemple par Boost. Je n'ai pas encore eu le temps de
le regarder plus en détail, mais j'ai l'impression qu'il fonctionne
vraiment bien (prise en compte automatique des dépendances des
#include, évite de recompiler trop ou pas assez, rapide quand
il n'y a rien à recompiler même sur un grand projet).
Falk
|
|
| Back to top |
|
 |
news Guest
|
Posted: Fri Aug 05, 2005 8:30 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Xandros wrote:
| Quote: | Bonjour,
Je veux me mettre au C++, j'ai donc acheter un livre sur le C++ (ça
aide) et j'ai installé Anjuta sous Linux Debian.
J'ai un AMD 3000+ avec 1Gho de RAM, donc c'est pas trop une vieux coucou.
J'ai tapé mon premier programme, il fait 10 lignes, un genre de "Hello
World". ça met 3 secondes à compiler et 2 secondes à construire ! je
trouve ça un peu long ? non ?
Le jour où je vais avoir un programme de 1000 lignes, ça va mettre 300
secondes (soit 5 minutes) à compiler + 200 secondes (soit 3 minutes 30)
à construire ? si il faut attendre 8 minutes 30 pour savoir si y a un ug
!!!
|
Ca vient probablement de Anjuta. Rapide test chez moi : 28000 lignes en
1min 30s (linkage compris) sur un amd 1.8Ghz (avec d'autres progs en
train de tourner), mais en utilisant make.
Ecrire son Makefile peut avoir du bon des fois (surtout quand on
apprend). Les autoconf c'est plutot pour la distribution, mais tu n'en
est pas encore la je suppose.
|
|
| Back to top |
|
 |
Xandros Guest
|
Posted: Fri Aug 05, 2005 10:52 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Bonjour,
Merci à tous pour vos réponses, apparement faire un Makefile peu
optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page
47 du bouquin :)
@+
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Fri Aug 05, 2005 11:12 am Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
"Xandros" <vbload (AT) free (DOT) fr> a écrit dans le message de news:
42f34504$0$22305$8fcfb975 (AT) news (DOT) wanadoo.fr...
| Quote: | Bonjour,
Merci à tous pour vos réponses, apparement faire un Makefile peu optimiser
la compilation ?
|
En évitant de re-compiler les sources qui n'ont pas été modifiés.
| Quote: | Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page 47
du bouquin
|
A supposer que le livre en parle.
Ce ne sera pas le cas si il est consacré uniquement à la programmation.
--
-Stan
|
|
| Back to top |
|
 |
news Guest
|
Posted: Fri Aug 05, 2005 12:17 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Xandros wrote:
| Quote: | Bonjour,
Merci à tous pour vos réponses, apparement faire un Makefile peu
optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page
47 du bouquin
|
Pour commencer, un Makefile du type
---
prog: prog.o
g++ prog.o -o prog
prog.o: prog.c++
g++ -c prog.cpp
-----
en executant 'make prog', ca devrait aller.
Pour comprendre ce qu'il se passe, voir le manuel (pas la page man) de
make: ftp://ftp.gnu.org/gnu/Manuals/make/html_chapter/make_2.html
entre autres.
|
|
| Back to top |
|
 |
noone@nowhere.com Guest
|
Posted: Fri Aug 05, 2005 4:06 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Xandros a écrit :
| Quote: | Bonjour,
Merci à tous pour vos réponses, apparement faire un Makefile peu
optimiser la compilation ?
Je ne sais pas encore ce que c'est qu'un Makefile, j'en suis à la page
47 du bouquin :)
@+
|
Pour comprendre un peu le Makefile je te conseille de faire l'essai
suivant :
1 : faire un hello world classique
// main.cc
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "Hello world !" << endl;
return EXIT_SUCCESS;
}
tu peux compiler en tapant en ligne de commande
g++ main.cc -o main
où -o signifie output c'est à dire sortie donc c'est le nom de l'executable
voici le Makefile de base (pas de prérequis)
all:
g++ main.cc -o main
(attention la ligne g++ commence par une tabulation... pas par des
espaces !)
tu compiles en tapant make
2
Le problème : chaque fois que tu tapes make ça recompile (même si tu
n'as pas modifié main.cc)
Il faut donc modifier le Makefile pour indiquer la dépendance à main.cc
tu peux par exemple écrire ça à la place de ton Makefile
main: main.cc
g++ main.cc -o main
tu tape make et ça compile
sans modifier main.cc tu retapes make
make: « main » est à jour.
Donc ça ne compile pas pour rien
3
Tu es un peu feignant et réécrire main.cc et main dans la ligne de
compilation ça te barde donc tu utilises les raccourcis
ton Makefile devient alors
main: main.cc
g++ $< -o $@
(bon je sais les raccourcis ne sont pas très parlant... mais info make
te les donne)
$@ Le nom de la cible
$< Le nom de la première dépendance
$^ La liste des dépendances
$? La liste des dépendances plus récentes que la cible
$* Le nom du fichier sans suffixe
4
Maintenant tu veux que cout << "Hello world !" << endl; soit dans une
fonction
donc dans un premier temps tu écris
#include
using namespace std;
void hello(void)
{
cout << "Hello world !" << endl;
}
int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}
puis tu compiles avec ton Makefile
main: main.cc
g++ main.cc -o main
en tapant make
5.
Tu veux maintenant mettre la fonction hello() dans un autre fichier
Dans un premier temps on va la mettre dans le même fichier mais à la fin
#include
using namespace std;
void hello(void);
int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}
void hello(void)
{
cout << "Hello world !" << endl;
}
puis tu compiles avec ton Makefile
main: main.cc
g++ main.cc -o main
en tapant make
6. on peut maintenant mettre tout ça dans 3 fichiers
main.cc hello.cc hello.h
//main.cc
#include
using namespace std;
#include "hello.h"
int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}
//hello.h
void hello(void);
//hello.cc
#include <iostream>
using namespace std;
void hello(void)
{
cout << "Hello world !" << endl;
}
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec
l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
../main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o
g++ $^ -o $@
main.o: main.cc
g++ $< -c
hello.o: hello.cc
g++ $< -c
Il suffit de taper make et ça roule... ;-)
ça compile main.cc pour faire main.o
ça compile hello.cc pour faire hello.o
ça link hello.o et main.o pour faire l'executable main
Et voila... ton premier Makefile de base... plus d'info sur le net...
@+
|
|
| Back to top |
|
 |
noone@nowhere.com Guest
|
Posted: Fri Aug 05, 2005 5:54 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
j'ai oublié de préciser
les autotools permettent de créer automatiquement un Makefile
Une fois que tu as pris ça en main tout logiciel se compile et
s'installe via les 3 "fameuses" commandes Linux
../configure
make
make install
en fait
c'est plutôt
su (pour devenir root) puis
make install
configure permet de créer le Makefile (après vérification des
bibliothèques nécessaires, de la présence du compilateur, etc...)
make interprète le Makefile pour compiler le programme
make install : installe le programme
ensuite comme les autotools sont assez standard (sous Linux) il est même
possible de transformer automatiquement tes sources en paquet logiciel
binaire (.rpm ou .deb)
donc Autotools... c'est l'étape suivante... mais il faut déjà faire plus
qu'un Hello World pour que ça soit rentable ;-)
En plus je pense que ça devient un peu HS ici...
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Fri Aug 05, 2005 11:09 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
[email]noone (AT) nowhere (DOT) com[/email] wrote:
| Quote: | 6. on peut maintenant mettre tout ça dans 3 fichiers
main.cc hello.cc hello.h
//main.cc
#include
using namespace std;
#include "hello.h"
int main(int argc, char** argv)
{
hello();
return EXIT_SUCCESS;
}
//hello.h
void hello(void);
//hello.cc
|
J'ajouterais ici
#include "hello.h"
ce qui permet au compilateur de vérifier la cohérence entre la
déclaration et la définition de la fonction hello().
| Quote: | #include
using namespace std;
void hello(void)
{
cout << "Hello world !" << endl;
}
Tu peux alors compiler ***séparémement*** main.cc et hello.cc (avec
l'option -c de gcc)
Regarde !
g++ main.cc -c
donne un fichier objet main.o
g++ hello.cc -c
donne un fichier objet hello.o
Il ne reste plus qu'à les lier
g++ hello.o main.o -o main
et l'executable main (-o = output = sortie)
./main permet d'executer
Maintenant regardons le Makefile
main: main.o hello.o
g++ $^ -o $@
|
Puis il faut ajouter le fichier hello.h à la liste des dépendances
des .o car une modification de ce fichier nécessite une récompilation:
| Quote: | main.o: main.cc
main.o: main.cc hello.h
g++ $< -c
hello.o: hello.cc
hello.o: hello.cc hello.h
g++ $< -c
|
Dans les grands projets, avec des centaines des fichiers #include
directs et indirects, la génération manuelles des dépendances devient
vite ingérable. Heureusement, et capable de les générer, il suffit
de lui passer l'option -M (ou -MM, ce qui est normalement suffisant).
Falk
|
|
| Back to top |
|
 |
Fr@d Guest
|
Posted: Sat Aug 06, 2005 1:30 pm Post subject: Re: Temps de compilation avec C++ sous Linux ? |
|
|
Merci beaucoup pour ces infos, même si je n'ai pas tout compris.
le C++ ça a l'air complexe quand même ? non ?
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|