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

Langage Delphi Discussion :

Optimisation vitesse de création d'un très long string


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut Optimisation vitesse de création d'un très long string
    Hello,

    Dans mon logiciel, je sauvegarde des points (environ 100'000 à 200'000 points avec précision à 10 chiffres après la virgule). Pour accélérer l'ouverture du fichier, je stock tous les points concaténés en un seul string. Effectivement la lecture est extrêmement rapide, mais pour la sauvegarde je me retrouve face à un problème :

    - je lis mes points au fur et à mesure et j'agrandis un TStringStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    points := TStringStream.Create('') ;
    for i := 0 to nbPoints do
      points.WriteString(tabPoints[i]+#13+#10) ;
    monParseurXML.Save(points.ReadString(points.Size)) ;
    points.Free ;
    J'ai constaté qu'au fur et à mesure de l'avancement de la sauvegarde, la fonction points.WriteString() met de plus en plus de temps à s'exécuter. J'ai le sentiment que le soft cherche un nouvel espace mémoire et doit recopier le stringStream, ce qui prend du temps.

    Je cherche donc à accélérer la création de cet énorme string qui contient tous les points. Le problème est que je suis obligé d'utiliser un paramètre de type string pour ma sauvegarde.

    Avez-vous des conseils ?

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Est-ce que tabPoints[i] a toujours la même longueur ? Y a-t-il un maximum de longueur ?
    Si oui, pré-alloue ta chaîne de caractères avec SetLength, c'est vraiment très important. Et si non, alloue quand même celle-ci par blocs.
    Ne pas faire de concaténations : ça prend trop de temps car il faut systématiquement réallouer de l'espace mémoire.

    N'utilise pas TStringStream, mais directement un string, c'est beaucoup plus efficace, car cette classe souffre d'un défaut d'implémentation de la méthode Write, qui la rend inutilisable dans ton cas. Au mieux, il faudrait redéfinir cette méthode dans une classe dérivée : ça pourrait passer.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    si possible essaye de modifier ta méthode d'enregistrement pour enregistrer les points au fur et a mesure directement a la fin du fichier de destination en mode APPEND
    @+

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par WolffN Voir le message
    si possible essaye de modifier ta méthode d'enregistrement pour enregistrer les points au fur et a mesure directement a la fin du fichier de destination en mode APPEND
    Dans l'idéal c'est ce que je ferais, mais ça implique trop de modifications à l'heure actuelle.

    @sjrd : tabPoints[i] est un real, donc 8 bytes maximum.
    Je suis d'accord avec ta technique de commencer par allouer complètement l'espace pour le string, mais ensuite comment le remplir correctement sans concaténation ? J'aurais besoin d'un petit bout de code à ce niveau-là..

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par MiJack Voir le message
    @sjrd : tabPoints[i] est un real, donc 8 bytes maximum.
    Oui mais attention, il s'agit de la taille lorsqu'il est transformé en chaîne : comment le transformes-tu ?
    Citation Envoyé par MiJack Voir le message
    Je suis d'accord avec ta technique de commencer par allouer complètement l'espace pour le string, mais ensuite comment le remplir correctement sans concaténation ? J'aurais besoin d'un petit bout de code à ce niveau-là..
    Ce n'est pas trivial. L'idée est d'utiliser un buffer temporaire, puis de faire un Move :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      BufStr, ResStr: string;
      Position, I: Integer;
    begin
      SetLength(ResStr, nbPoints*(MaxSize+2)); // 2 = #13#10
      Position := 1;
      for I := 0 to nbPoints-1 do
      begin
        BufStr := tabPoints[i]+#13#10; // avec une conversion si nécessaire
        Move(BufStr[1], ResStr[Position], Length(BufStr));
        Inc(Position, Length(BufStr));
      end;
      SetLength(ResStr, Position);
    end;
    Code non complet et non testé : à toi d'adapter
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Ton bout de code fonctionne parfaitement.

    Le seul problème est l'approximation de la taille maximale à stocker. J'ai fixé 20 caractères, ce qui ne devrait jamais être dépassé.

    Merci, grâce à toi je suis passé d'un temps de sauvegarde pour 100'000 points de 1min 15 à 3 secondes

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

Discussions similaires

  1. [AC-2007] Affichage formulaire en Mode Création très long
    Par rch05 dans le forum IHM
    Réponses: 4
    Dernier message: 28/09/2011, 19h07
  2. Import très long - comment optimiser
    Par Stanwill dans le forum Import/Export
    Réponses: 6
    Dernier message: 18/02/2010, 12h39
  3. Réponses: 3
    Dernier message: 28/10/2008, 09h46
  4. delete très long
    Par slefevre01 dans le forum Oracle
    Réponses: 7
    Dernier message: 06/10/2005, 13h16
  5. Très long texte dans Quick Report - Comment faire ?
    Par delphi+ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 22h18

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