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 :

[String] Comment obtenir le nombre d'occurences d'une sous-chaîne dans une chaîne ?


Sujet :

Langage Delphi

  1. #21
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Pour éviter un troll sur pointeur pas pointeur, je veux juste dire qu'on cherche ici la meilleure méthode pour trouver le nb d'occurences de 1 caractère dans une chaine pour une eventuelle publication en FaQ. Par meilleur on entend 1) simple à comprendre
    2) le plus rapide possible

    En cela je pense que la version que j'ai écrite depuis le début est meilleure que celle de Bloon, Tests à l'appui. Je n'affirme pas que les pointeurs sont inutiles dans Delphi.

  2. #22
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par -Sylvain Leray-
    Pour éviter un troll sur pointeur pas pointeur, je veux juste dire qu'on cherche ici la meilleure méthode pour trouver le nb d'occurences de 1 caractère dans une chaine pour une eventuelle publication en FaQ. Par meilleur on entend 1) simple à comprendre
    2) le plus rapide possible

    En cela je pense que la version que j'ai écrite depuis le début est meilleure que celle de Bloon, Tests à l'appui. Je n'affirme pas que les pointeurs sont inutiles dans Delphi.
    T'as raison sur le troll , pour les pointeur si l'on peut s'en passer c'est mieux. Par contre la différence entre nos deux test.... là je pige pas ? (Ou alors j'min gouré en relevant les deux chiffres )

    La version d'oceane est bien...même si il y a quand même une boucle (dans le stringreplace)

  3. #23
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Eric.H,
    veux tu bien refaire tes tests avec exactement le code que j'ai posté pour mes séries de 10 tests, avec les optimisations et options de compilations auxquelles je ne suis pas sûr d'avoir tout compris ?

    Sur deux machines différentes, et en prenant le même nombre de lancement des même fonctions ( 70.000 donc) on pourra plus facilement comparer des résultats comparables.

    Merci d'avance !

  4. #24
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Dans un souci d'impartialité, j'ai inclus la méthode de Oceane dans mon prog de test sans rien y modifier. Le résultat est bon ( 70 occurences de 'b' dans Longuechaine) Mais par contre les performances ne sont pas au rendez vous.

    Test1 (lancement 70.000 fois de la fonction) :
    Avec pointeurs : 985 millisecondes
    Sans pointeurs : 814 millisecondes
    StringReplace : 89125 millisecondes ( 1 minute 29 sec !)

    Test2 :
    Avec pointeurs : 1000 millisecondes
    Sans pointeurs : 797 millisecondes
    StringReplace : 88140 millisecondes

    Je n'ai pas continuer sur 10 tests, ça faisait un peu long !

    Quelqu'un a une autre méthode qui soit à la fois simple à comprendre et plus performante que les 3 sus-testées ? ça va finir en concours cette histoire !
    La Golden Function Cup

  5. #25
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    La version pointeur est très légèrement plus rapide si on procède ainsi :

    => on passe un PChar directement, plutôt que de faire le cast dans la fonction

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    function NbPoints(Const SousChaine : Char; Const Chaine: ShortString) : Integer;
    var
     i : Integer;
    begin
        result:=0;
        For i:=1 to length(Chaine) do
          if Chaine[i]=SousChaine then
            inc(result);      //On compte le nb de points
     
    end;
     
    // Renvoie le nombre d'occurrences du caractère 'c' dans la chaine 's'
    // function nbOccurrences(c : char; const s : ansistring) : integer;
    function nbOccurrences(const c : char; p : PChar) : integer;
    begin
      result := 0;
      if p^ = #0 then
        exit;
      repeat
        if (p^ = c) then
          inc(result);
        inc(p);
      until (p^ = #0);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      LongueChaine : string;
      Start : Integer;
      i,j,nb : integer;
      p : PChar;
    begin
      LongueChaine := '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!'+
                      '123Bb456Cb789:b12345bbbb!';
     
      //Premier test avec pointeurs (méthode de bloon)
      Start:= GetTickCount;
      p := PChar(LongueChaine);
      For j := 1 to 20 do
      begin
        For i := 1 to 50000 do
        begin
          nb := nbOccurrences('b',p);
        end;
      end;
      label1.caption:=IntToStr(GetTickcount-Start);
     
      //Second test sans pointeurs, (méthode de Sylvain)
      Start:= GettickCount;
      For j := 1 to 20 do
      begin
        For i := 1 to 50000 do
        begin
          nb := NbPoints('b',longuechaine);
        end;
      end;
      label2.caption:=IntToStr(GetTickcount-Start);
     
    end;
    donc à mon avis, les pointeurs...

    Bloon

  6. #26
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Félicitations Bloon, après avoir inclus tes modifs dans mon prog de test, les performances sont vraiment meilleures qu'avant ta modif.

    Maintenant, la "version de Bloon" est environ 2% plus rapide que la mienne. et sur certains tests on obtient les même résultats (469 Milliseconds)

    Sauf candidats extérieurs on peut dire que Bloon a gagné la première Golden Function Cup ! Bravo !

  7. #27
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    C'est plus rapide parce qu'on fait un traitement N fois sur la même chaine de caractères que l'on caste en PChar une seule fois. Si la chaine changeait à chaque itération, il faudrait faire le cast string -> PChar à chaque fois, et là, la version pointeur redeviendrait moins rapide.

    Bloon

  8. #28
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    les enfants s'amusent ;-)

    e-ric

  9. #29
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Ah oui j'avoue que je me suis bien amuser avec tous ces tests ! C'est mon petit sucre dans le café de la journée, c'est ma pause entre deux développements pour le boulot ! J'ai soumis l'idée au chef Delphi pour faire plus souvent ce genre de concours inutiles mais amusants, on verra bien

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  2. Réponses: 2
    Dernier message: 17/04/2010, 06h55
  3. Réponses: 8
    Dernier message: 26/03/2010, 08h16
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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