performance de lecture de fichiers formatés
  Home FAQ Contact Sign in
fr.comp.lang.c++ only
 
Advanced search
POPULAR GROUPS

more...

fr.comp.lang.c++ Profile…
 Up
performance de lecture de fichiers formatés         


Author: Ploc
Date: May 3, 2008 12:46

Bonjour,

j'ai un fichier du style :

label 2.3 4.5 5.6
label2 1.2 1.0 -2.
...

qui est assez gros (près d'1 Go).

J'avais un programme C à base de fscanf.
En passant de C (à base de fscanf) à c++ avec ifstream (voir le code en
bas), je passe de 1min 40s en C à 3min 10s en c++.

Je trouve que ca fait un gap quand même.
Comme je n'ai pas trop d'expérience sur les fichiers en c++, je m'en
remets à vous.

Vous pouvez me dire si vous voyez des choses à améliorer pour avoir de
meilleures performances (plus proches du C)?

Je joins un bout de code avec uniquement la lecture du fichier et
l'extraction des données.
Le code C fait la même chose mais avec fscanf et feof. Je peux le donner
si ca peut aider.
Show full article (1.14Kb)
37 Comments
Re: performance de lecture de fichiers formatés         


Author: Ploc
Date: May 3, 2008 12:49

Ploc wrote:
> Bonjour,
>
> j'ai un fichier du style :
>
> label 2.3 4.5 5.6
> label2 1.2 1.0 -2.
> ...
>
>
> qui est assez gros (près d'1 Go).
>
> J'avais un programme C à base de fscanf.
> En passant de C (à base de fscanf) à c++ avec ifstream (voir le code en
> bas), je passe de 1min 40s en C à 3min 10s en c++.
>
> Je trouve que ca fait un gap quand même.
> Comme je n'ai pas trop d'expérience sur les fichiers en c++, je m'en
> remets à vous.
> ...
Show full article (1.43Kb)
no comments
Re: performance de lecture de fichiers formatés         


Author: Fabien LE LEZ
Date: May 3, 2008 13:12

On Sat, 03 May 2008 21:46:32 +0200, Ploc :
>Le code C fait la même chose mais avec fscanf et feof. Je peux le donner
>si ca peut aider.

Ce serait probablement une bonne idée, histoire d'avoir une référence
pour la performance.
no comments
Re: performance de lecture de fichiers formatés         


Author: Fabien LE LEZ
Date: May 3, 2008 13:37

On Sat, 03 May 2008 21:46:32 +0200, Ploc :
>En passant de C (à base de fscanf) à c++ avec ifstream (voir le code en
>bas), je passe de 1min 40s en C à 3min 10s en c++.

As-tu fait les mesures avec time (et, accessoirement, un top dans une
autre console) ? 10 Mo/s, ce n'est pas très loin de la vitesse
effective de lecture d'un fichier sur disque ; time (la fonction de
bash, pas celle de C ou C++) permet de savoir combien de temps le
processeur met effectivement pour décoder le fichier. Tu t'apercevras
peut-être que le programme en C++ est encore plus mauvais que tu le
croyais.
> while (! ifs.eof())
> {
> ifs >> lc>>x>>y>>z;
> if (!ifs.eof())
> {
> count ++;
> }
> }
Show full article (1.97Kb)
no comments
Re: performance de lecture de fichiers formatés         


Author: Sylvain SF
Date: May 3, 2008 15:17

Fabien LE LEZ wrote on 03/05/2008 22:37:
> On Sat, 03 May 2008 21:46:32 +0200, Ploc :
>
>> En passant de C (à base de fscanf) à c++ avec ifstream (voir le code en
>> bas), je passe de 1min 40s en C à 3min 10s en c++.
>
> As-tu fait les mesures avec time (et, accessoirement, un top dans une
> autre console) ? 10 Mo/s, ce n'est pas très loin de la vitesse
> effective de lecture d'un fichier sur disque

pas vraiment, avec fread et un buffer de 64Ko, je lis 180Mo en 3 sec.!
(à la première lecture d'un fichier non caché - les lectures suivantes
prennent 172 ms), écart mesuré avec _ftime sur un binaire (fopen("rb"))

le "temps de lecture effectif" a tout chance d'être négligeable par
rapport au traitement de texte (scanf ou istream) qui est le problème
ici.
> [...] puis j'analyse chaque ligne moi-même (y compris, dans
> certains cas, avec sscanf). Mais je m'intéresse plus au
> contrôle d'erreur qu'aux performances.

et tu as p.e. les 2.
Show full article (0.99Kb)
no comments
Re: performance de lecture de fichiers formatés         


Author: p-fifty-fifty
Date: May 3, 2008 15:23

On 3 mai, 21:46, Ploc wrote:
> while (! ifs.eof())

une lecture ne se fait pas sur std::ios::eof()

je verrais plutot la lecture comme ca (non testé)
while(( ifs >> x >> y >> z ))
{}

cf FAQ C++ de developpez
no comments
Re: performance de lecture de fichiers formatés         


Author: Fabien LE LEZ
Date: May 3, 2008 16:05

On Sun, 04 May 2008 00:17:55 +0200, "Sylvain SF" :
>pas vraiment, avec fread et un buffer de 64Ko, je lis 180Mo en 3 sec.!

Ça m'étonnerait beaucoup que tu aies une telle vitesse sur toute la
surface du disque.
no comments
Re: performance de lecture de fichiers formatés         


Author: Sylvain SF
Date: May 3, 2008 16:12

Fabien LE LEZ wrote on 04/05/2008 01:05:
> On Sun, 04 May 2008 00:17:55 +0200, "Sylvain SF" :
>
>> pas vraiment, avec fread et un buffer de 64Ko, je lis 180Mo en 3 sec.!
>
> Ça m'étonnerait beaucoup que tu aies une telle vitesse sur toute la
> surface du disque.

pour être honnête j'étais sous les 3 sec. (2.6); je ne pense pas qu'un
fichier à la périphérie prendra 10 fois le temps d'un fichier près du
centre - ce faisant je n'imagine pas que l'on parle d'un disk de +5 ans
d'age.

je répète le point qui me semble "time consuming" et qui donc devrait
être imho le point d'intérêt : la conversion texte en float.

la lecture binaire est rapide - ok sauf en PATA de base avec un disk
poussif.

Sylvain.
no comments
Re: performance de lecture de fichiers formatés         


Author: Sylvain SF
Date: May 3, 2008 16:26

Fabien LE LEZ wrote on 04/05/2008 01:05:
> On Sun, 04 May 2008 00:17:55 +0200, "Sylvain SF" :
>
>> pas vraiment, avec fread et un buffer de 64Ko, je lis 180Mo en 3 sec.!
>
> Ça m'étonnerait beaucoup que tu aies une telle vitesse sur toute la
> surface du disque.

2.8 sec. (pas .6) sur la 1ière partition, 5.1 sec. sur la 4ième
et dernière, ça influe ... d'un facteur <2 pas de 6.

Sylvain.
no comments
Re: performance de lecture de fichiers formatés         


Author: Fabien LE LEZ
Date: May 3, 2008 18:58

On Sat, 03 May 2008 21:46:32 +0200, Ploc :
>En passant de C (à base de fscanf) à c++ avec ifstream (voir le code en
>bas), je passe de 1min 40s en C à 3min 10s en c++.

Après quelques essais, j'ai bien l'impression que parser soi-même les
données apporte un gain de performances assez confortable.

Soit donc un

struct Destination
{
std::string label;
float a, b, c;
};

que je remplis par lecture d'une ligne dans le fichier, puis que je
jette sans rien en faire. Recommencer jusqu'à épuisement du fichier.
En cas d'erreur de format, on considère que la ligne est déficiente,
et on passe à la suivante.

J'ai fait les tests sur un AMD Athlon64 double coeur, 2,4 GHz, avec
2 Go de RAM. Debian 64 bits, g++ 4.1.2, optimisation "-O3".
Show full article (5.91Kb)
no comments
 
1 2 3 4