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

Framework .NET Discussion :

[Performances] Lire un flux ligne par ligne


Sujet :

Framework .NET

  1. #1
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut [Performances] Lire un flux ligne par ligne
    Bonjour,

    Je cherche à faire un traitement ligne par ligne sur un flux d'entrée. Ce flux est potentiellement très long et je cherche à avoir du code très performant. Pour l'exemple, supposons que je veuille lire/écrire sur l'entrée/sortie standard.

    J'ai donc écrit une boucle du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (s = System.Console.ReadLine()) != null do
        // traitement
        System.Console.WriteLine(s)
    Cependant, cela se révèle être assez lent. Avec un traitement vide, cela m'a pris 12 secondes, alors que d'autres outils (par exemple sed) sont capables de traiter une telle entrée en 2,2 secondes.

    J'ai mesuré les performances séparément : la boucle ReadLine prend 2,5 secondes et WriteLine prend 7,9 secondes. J'ai donc essayé d'utiliser un buffer (StringBuilder, en prenant soin qu'il n'y ait jamais de réallocation) pour limiter le nombre d'appels systèmes en sortie. Cela a divisé le temps d'écriture par deux, mais j'aimerais faire mieux.

    Comment obtenir des performances comparables à ce que font les programme C, au niveau des entrées/sorties ? Y a-t-il des méthodes plus efficaces que ReadLine/WriteLine pour récupérer des chaines ligne par ligne ?

    Merci par avance.

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Si tu cherches une grosse performance pour un traitement bien particulier, et que tu possèdes les compétences pour l'écriture en C, voir en Assembleur, tu auras toujours de meilleures performances qu'en .NET.

  3. #3
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    J'imaginais que les entrées/sorties pouvaient être aussi rapides en .Net qu'en C. Je ne vois pas très bien comment il pourrait y avoir de grandes différences (ok, il y a la gestion des strings, mais c'est censé être négligeable).

    Le reste de mon code est de l'assembleur IL généré intelligemment et devrait être particulièrement rapide. De plus, mon code utilise des expressions rationnelles compilées, qui offrent de très bonnes performances (meilleures que celles des programmes C testés).

    Et l'avantage principal par rapport au C ? Mon code est juste 10 fois plus court et plus sûr qu'il ne l'aurait été en C. De plus, le binaire est portable.

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    je c qu'en java le package java.IO est entièrement managé et super lent comparé au natif d'où l'introduction du package java.nio (new io) bien plus rapide mais non managé.

    Qu'en est il des IO .net ?

  5. #5
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    La perte de performance est liée au côté managé de .NET; j'en suis certain. Il faut voir le contexte d'application. Si ton application doit avoir des très bonnes performances, quelques routines bas niveaux seront l'idéal.

  6. #6
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Merci pour la piste, je vais essayer de voir ça.

  7. #7
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Après quelques tests, il s'avère que le StringBuilder convient. Je l'initialise avec une capacité assez grande, je fais des append dedans quand je dois écrire et je vide le buffer quand il est rempli.

    En comptant le traitement dans la boucle, mon programme est maintenant plus rapide que les programmes C que j'avais en référence. L'IO brute reste plus lente, mais c'est négligeable quand les traitements augmentent.

    Bref, résolu !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. lire une base de donnee ligne par ligne
    Par thildouille dans le forum Langage
    Réponses: 9
    Dernier message: 03/06/2011, 00h50
  3. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  4. Réponses: 3
    Dernier message: 16/10/2007, 20h45

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