IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lire dans un pipe rapidement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 45
    Par défaut Lire dans un pipe rapidement
    Bonjour

    Y a-t-il un moyen de lire plus rapidement dans un pipe que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
    	char * string;
    	int pfdio[2];
    } strpfd;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	unsigned sizeMsg = 300000;
    	char * buffer = malloc(sizeof(char) * sizeMsg);
    	unsigned int n;
    	while ((n=read(strpfdturnread->pfdio[0], buffer, sizeof(char)*sizeMsg)) > 0)
    	{
    		strncat(strpfdturnread->string, buffer, n);
    	}
    strpfdturnread est un struct strpfd, ce struct est obligatoire.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Bonjour,

    strncat() est faite pour gérer des chaînes de caractères. Tu risques d'avoir des ennuis avec si tu t'en sers pour traiter des données binaires et que celles-ci contiennent des zéros.
    Par ailleurs, strcat() et strncat() déterminent elle-même la position de la fin de la chaîne à chaque fois que tu les appelles, en partant du début et en la remontant entièrement jusqu'à rencontrer le zéro final. Il est évident que c'est dramatique pour les performances.

    Essaie plutôt de conserver le nombre total de caractères reçus à travers read() et de te servir de ce nombre comme index. Tu indiques alors directement à read() à quel endroit déposer la suite plutôt que la recevoir dans un buffer fixe et la concaténer ensuite avec le reste.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 45
    Par défaut
    Merci pour ta réponse

    Mais je traite des chaines de caractère, et pas du binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Essaie plutôt de conserver le nombre total de caractères reçus à travers read() et de te servir de ce nombre comme index
    Par contre, je ne sais pas d'avance le nombre total de caractères reçus.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Vous pouvez savoir la taille de la chaîne à l'avance si le programme émetteur l'envoie.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    J'ajouterai que passer par un buffer intermédiaire n'a pas d'intérêt dans l'exemple présenté.
    De plus, "strpfdturnread->string" n'est pas alloué mais je suppose que l'exemple est incomplet.

    Au final, le code devrait ressembler à quelque chose comme ça :
    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
     
      typedef struct
      {
        char * string;
        int pfdio[2];
      } strpfd;
     
      unsigned sizeMsg = 300000;
      strpfd strfdturnread;
      if( ( strfdturnread.string = malloc( sizeMsg ) == NULL ) { sortir du programme }
     
      ssize_t n;
      size_t position_append = 0;
      while( ( n = read( strfdturnread->pfdio[ 0 ], strfdturnread->string + position_append, sizeMsg - position_append ) ) > 0 )
      {
        position_append += n;
      }
     
      * ( strfdturnread->string + position_append ) = NULL;
    Le code n'est pas testé mais tu as la trame algorithmique. Ce code sera beaucoup plus rapide que le tien pour plusieurs raisons :
    1. comme déjà dit, strcat cherche à chaque fois depuis le début de chaîne pour trouver le caractère NULL
    2. il n'y a pas de copie dans un buffer intermédiaire, les données sont directement copiées dans le buffer final
    3. on prend en compte le nombre de caractère lus pour se positionner immédiatement au bon emplacement mémoire dans le buffer
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 45
    Par défaut
    Merci !

    Cela a largement amélioré la performance !

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 09/08/2005, 12h57
  2. Lire dans un champ MEMO
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 15h54
  3. Réponses: 23
    Dernier message: 22/04/2004, 11h55
  4. Insertion dans fichier texte + rapide que TStringList ?
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 26/02/2004, 11h34
  5. Réponses: 3
    Dernier message: 12/11/2003, 00h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo