J'ai une question pour fearyourself : as-tu utilisé fread au lieu de fgets pour une raison particulière ?
Etant donné qu'il s'agit de donné de type "Texte", fgets me parrait plus approprié, mais peut-être moins rapide ?
J'ai une question pour fearyourself : as-tu utilisé fread au lieu de fgets pour une raison particulière ?
Etant donné qu'il s'agit de donné de type "Texte", fgets me parrait plus approprié, mais peut-être moins rapide ?
K
Avec fread je peux lui dire de lire 4k par 4k or fgets s'arrête à chaque ligne. Donc de toute façon, avec fgets on est perdant vu qu'il y a un vérificateur de caractères dans la fonction (pour s'arrêter à la fin de la ligne...)...Envoyé par KiLVaiDeN
Le fait que ce soit du texte ne veut pas dire qu'on ne peut pas utiliser fread...
Jc
Hum. Fait le test 2 fois de suite pour voir ? Je me méfie des caches...Envoyé par fearyourself
Idem avec les autres codes...
Pour le tien, il devrait être encore plus efficace avec une taille de BUFSIZ.
Pas de Wi-Fi à la maison : CPL
Attention quand meme a ce genre de test. Le facteur limitant est l'acces disque, qui n'est pas deterministe (il depend des acces demandes par d'autres applications). Il faut faire des moyennes.
Merci pour l'info fearyourself Je comprend mieux pourquoi fread est plus rapide ^^
K
J'ai fait les tests 10 fois pour chaque version avant de donner les résultats (je suis aussi méfiant! )Envoyé par DaZumba
Les temps changent mais l'ordre de grandeur est toujours le même...
Ma version: 0.2
Emmanuel: 1.2
fgets: 2.4
Voir ci-dessusHum. Fait le test 2 fois de suite pour voir ? Je me méfie des caches...
Idem avec les autres codes...
Testez sur vos machines , on verra si ça fonctionne avec d'autres disques
Jc
Question pour fearyourself : par curiosité, si dans tes tests tu testais la différence plutot que l'inégalité ?
Peut-être que ça irait encore plus vite...
K
Ou d'autres systèmes...Envoyé par fearyourself
Pas de Wi-Fi à la maison : CPL
Ce qui est important pour moi c'est le temp oui, quelque chose de portable. Sinon, pas de longueur fixe pour les enregistrements.
En gros du total inconnu a par la forme de l'enregsitrement.
Vive le C => Quoique pas sympa pour la mémoire de mon PC.
Seul le chat le savait!!!!
De la rigueur en programmation est maître mot!!!
Et avec BUFSIZ à la place de 4096 ?Envoyé par fearyourself
Pas de Wi-Fi à la maison : CPL
Moi mon, fichier test fait juste 5,52 go
Vive le C => Quoique pas sympa pour la mémoire de mon PC.
Seul le chat le savait!!!!
De la rigueur en programmation est maître mot!!!
Quelque chose du genre
devrait etre legerement mieux, du moins si memchr est correctement implemente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 while ( (size = fread(buf, 1, N, f)) > 0) { char* start = buf; char* end; while ( (end = memchr(start, '\n', size)) != NULL) { size -= (end-start) + 1; start = end+1; cnt++; } }
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Même temps, 0.2Envoyé par Emmanuel Delahaye
0.5 avec ton implémentationdevrait etre legerement mieux, du moins si memchr est correctement implemente.
Je vais faire les tests sur ma machine avec un fichier de 5.52 Go, on verra ce que ça donneMoi mon, fichier test fait juste 5,52 go
A suivre...
Jc
fearyourself : Je n'ai pas de compilo C ici, peux-tu juste me dire la vitesse de ça ? ( ton code un peu modifié )
Juste par curiosité !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <stdlib.h> #include <stdio.h> #define N 4096 int main(int argc, char **argv) { char buf[N]; int i,size; int cnt=0; if(argc!=2) return 1; FILE *f = fopen(argv[1],"r"); if(f==NULL) return 1; while((size=fread(buf,1,N,f))!=0) for(i=0;i!=size;i++) if(buf[i]=='\n') cnt++; fclose(f); printf("Lignes: %d\n",cnt); return 0; }
K
Ok, j'ai limité le fichier à 1 gig avec 37996448 lignes...
J'ai pris 1Go pour gardé le temps relativement bas...
Voici les résultats, 3 exécutions pour vérifier que les résultats sont pareils...
Ma version avec BUFSIZ:
Version d'Emmanuel:Lignes: 37996448
real 1m50.907s
user 0m3.357s
sys 0m1.111s
Donc même temps global par contre, temps user c'est catastrophique... L'attente des appels doit se cacher par le temps accès disque...37996448 lines
real 1m53.072s
user 0m22.407s
sys 0m1.623s
La version fgest utilisant aussi BUFSIZ comme taille maximale:
Version de Jean-Marc:Lignes: 37996449
real 1m50.811s
user 0m8.579s
sys 0m1.218s
Donc plus lent sur real mais pareil que moi sur user... Reste une version...Lignes: 37996448
real 1m54.894s
user 0m2.527s
sys 0m1.148s
Version de KiLVaiDeN:
Donc presque pareil... Finalement, on voit que sur un grand fichier, toutes les versions se ressemblent dans le temps total mais pas le temps user.Lignes: 37996448
real 1m52.317s
user 0m2.940s
sys 0m1.146s
Par contre, comment tu fais pour faire tourner sur un fichier de 5go une version en 2-3 minutes? Moi je pensais avoir un ordi correct mais si j'interpole j'arrive à 10m minimum...
Voili voilou,
Jc
Hum pas mal comme test, tu utilise quoi pour le chrono, ca pourrais m'être utile en cas de besoin d'optimisation pour les test
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Avec un while(fgets()).
Mon fichier fait 11 800 000 lignes pour 5.52 GO
Et comme je trouvais que mes 2 à 3 minutes était longue, je profite de mon fgets pour executer un premier traitement juste comparatif et du coup il met 4 minutes.
Sinon, je ne sais pas la config du PC. Comme c'est le PC du taff, tout du moins de mon stage.
Vive le C => Quoique pas sympa pour la mémoire de mon PC.
Seul le chat le savait!!!!
De la rigueur en programmation est maître mot!!!
Il y a un intru dans tes tests, qui retourne un mauvais nombre de lignes
K
Nan, en fait l'intru est le seul qui rend le bon nombre, problème de nombre de bout de bois et de piquets dans un jardin...Envoyé par KiLVaiDeN
Nos versions comptes les '\n', fgets compte les lignes...
Jc
Une question me turlupine : pourquoi compter les lignes ?
Je ne vois pas forcément l'interêt, si il s'agit d'un fichier sur lequel tu vas faire un traitement, je pense qu'il vaudrait mieux que tu fasses une structure de fichier un peu plus puissante, avec plus d'informations.
Je dis ça au posteur initial hein!
A+ et en tout cas merci pour les tests, c'était interessant
K
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager