1 votes

Performances de malloc/free + fgets en C

Lorsque je passe en boucle les lignes du fichier A, j'analyse la ligne et je place chaque chaîne ( char* ) en un char** .

En fin de ligne, je lance alors une procédure qui consiste à ouvrir le fichier B, en utilisant fgets , fseek y fgetc pour récupérer les caractères de ce fichier. Je ferme ensuite le fichier B.

Je répète la réouverture et la refermeture du fichier B pour chaque ligne.

Ce que je voudrais savoir, c'est :

  1. Est-ce que l'utilisation de malloc y free de sorte que je devrais utiliser quelque chose de statique comme myArray[NUM_STRINGS][MAX_STRING_WIDTH] au lieu d'un char** myArray ?

  2. L'ouverture et la fermeture du fichier B (en principe, plusieurs milliers de fois) entraînent-elles une surcharge importante des performances ? Si mon fichier A est trié, y a-t-il un moyen pour moi d'utiliser fseek pour revenir en arrière dans le fichier B, pour réinitialiser l'endroit où je me trouvais précédemment dans le fichier B ?

EDIT Il s'avère qu'une double approche a permis de réduire considérablement le temps d'exécution :

  1. Mon fichier B est en fait un des vingt-quatre fichiers. Au lieu d'ouvrir le même fichier B1 des milliers de fois, puis B2 des milliers de fois, etc. j'ouvre le fichier B1 une fois, je le ferme, B2 une fois, je le ferme, etc. Cela réduit de plusieurs milliers de fopen y fclose à environ 24.

  2. J'ai utilisé rewind() pour réinitialiser le pointeur de fichier.

Cela a permis de multiplier la vitesse par 60 environ, ce qui est plus que suffisant. Merci de m'avoir indiqué rewind() .

4voto

dmckee Points 50318

Si votre tableau dynamique s'agrandit dans le temps, il y a un coût de copie sur certaines parties du tableau. realloc s. Si vous utilisez l'heuristique "toujours double", ceci est amorti en O(n), donc ce n'est pas horrible. Si vous connaissez la taille à l'avance, un tableau alloué par la pile sera toujours plus rapide.

Pour la deuxième question, lisez ce qui suit rewind . Cela doit être plus rapide que d'ouvrir et de fermer tout le temps, et vous permet de gérer moins de ressources.

3voto

Ce que je voudrais savoir, c'est :

  • Votre code fonctionne-t-il correctement ?
  • Est-ce qu'il fonctionne assez vite pour votre objectif ?

Si la réponse à ces deux questions est "oui", ne changez rien.

1voto

Aiden Bell Points 19856

L'ouverture et la fermeture ont des frais généraux variables selon que d'autres programmes sont en concurrence pour cette ressource.

mesurez d'abord la taille du fichier et ensuite l'utiliser pour calculer la taille du tableau à l'avance pour faire une grande allocation du tas.

Vous n'obtiendrez pas tout de suite un tableau multidimensionnel, mais un peu d'arithmétique de pointeur et vous y êtes.

Ne pouvez-vous pas mettre en cache les informations de position dans l'autre fichier et ensuite, plutôt que de l'ouvrir et de le fermer, utiliser les index de recherche précédents comme décalage ? Tout dépend de la logique exacte.

1voto

Dolphin Points 2694

L'utilisation de la mémoire dynamique a toujours un impact sur les performances. L'utilisation d'une mémoire tampon statique permet d'améliorer la vitesse.

La réouverture d'un fichier aura également un impact sur les performances. Vous pouvez utiliser fseek(pos, SEEK_SET) pour placer le pointeur de fichier à n'importe quelle position dans le fichier ou fseek(offset, SEEK_CUR) pour effectuer un déplacement relatif.

Une baisse significative des performances est relative, et vous devrez déterminer ce que cela signifie pour vous.

1voto

TrayMan Points 3586
  1. Si vos fichiers sont volumineux, les entrées/sorties sur disque seront beaucoup plus coûteuses que la gestion de la mémoire. S'inquiéter des performances de malloc/free avant que le profilage n'indique qu'il s'agit d'un goulot d'étranglement est une optimisation prématurée.

  2. Il est possible que l'overhead des ouvertures/fermetures fréquentes soit significatif dans votre programme, mais encore une fois, les E/S réelles sont susceptibles d'être plus coûteuses, à moins que les fichiers soient petits, auquel cas la perte de tampons entre la fermeture et l'ouverture peut potentiellement causer des E/S disque supplémentaires. Et oui, vous pouvez utiliser ftell() pour obtenir la position actuelle dans un fichier, puis fseek avec SEEK_SET pour y accéder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X