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

 Delphi Discussion :

delete string delimiter optimisation TStringList LineBreak


Sujet :

Delphi

  1. #1
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut delete string delimiter optimisation TStringList LineBreak
    bonjour, je voudrais votre avis sur une fonction qui recherche et efface des occurrence dans une chaine string parce que je voudrais avoir une méthode rapide. merci pour vos remarques.

    chaine original avec en rouge ce que je veux effacer, la partie bleu aussi mais elle varie:
    \deaths_0\2\keyhash_0\a7a2f8801c3ae110aa3fbfee9d143abd\kills_0\0\ping_0\36\playername_0\ pingu\score_0\2\team_0\2\deaths_1\1\keyhash_1\817e7928c5dd97272dbd06be707d2cdf\kills_1\5\ping_1\40\playername_1\Buheheporcodio\score_1\5\team_1\2\deaths_2\0\keyhash_2\945c3160a248eb886dc83e5613d96857\kills_2\8\ping_2\49\playername_2\Torque.idk?\score_2\8\team_2\2\deaths_3\0\keyhash_3\160aad8653fb32fc7f49e29bc9695e1d\kills_3\0\ping_3\22\playername_3\De Man Met De Bril\score_3\0\team_3\2\deaths_4\2\keyhash_4\7c857e50cb6fb289e45f4b000a275f75\kills_4\1\ping_4\91\playername_4\Tom PL\score_4\1\team_4\2\deaths_5\0\keyhash_5\2c52ef003c6179bb9d7d827105ec7961\kills_5\0\ping_5\72\playername_5\NT|Archon\score_5\0\team_5\1\deaths_6\1\keyhash_6\1c3d869b0ca0962b2aa557dfe732dfc1\kills_6\0\ping_6\42\playername_6\Frederick Zoller\score_6\0\team_6\1\deaths_7\1\keyhash_7\f7761448739de0f4b223b8c1a75c2c9e\kills_7\0\ping_7\56\playername_7\Da Stuten Andi\score_7\0\team_7\1\deaths_8\2\keyhash_8\989022adc2dbfb30a269df4eeb09c649\kills_8\0\ping_8\137\playername_8\Twan\score_8\0\team_8\1\deaths_9\1\keyhash_9\f1c1d56abeb6b53015b5641c6b3dee2a\kills_9\2\ping_9\78\playername_9\[301]Fabiolo\score_9\2\team_9\1\deaths_10\0\keyhash_10\376cbea5eff00ae78ef2b0cd14a7770c\kills_10\1\ping_10\69\playername_10\AlFaMaNiAc\score_10\1\team_10\1\deaths_11\2\queryid\4111.1\keyhash_11\6dcba9dc3f85c6e17c6c57e15675c3dd\kills_11\0\ping_11\76\queryid\4111.2\playername_11\ZZZZZZZzzzzzzz\score_11\0\team_11\1\deaths_12\0\keyhash_12\5a1d27377560193263af744ebc90642d\kills_12\6\ping_12\56\playername_12\Wulz\score_12\6\team_12\2\deaths_13\1\keyhash_13\6c8370c10eba124af9ff47a994d8470a\kills_13\1\ping_13\66\playername_13\**Ñ** sergioten\score_13\1\team_13\1\deaths_14\1\keyhash_14\50c5fdf9de1dacf1277d3b680271e65d\kills_14\0\ping_14\66\playername_14\Napl3tek\score_14\0\team_14\1\deaths_15\1\keyhash_15\e999bedeeb4962ba3d6b298b11e2b732\kills_15\4\ping_15\54\playername_15\the Wiesel\score_15\4\team_15\1\deaths_16\1\keyhash_16\2c0228ccbadfb30f7a8b913651107747\kills_16\0\ping_16\40\playername_16\Soldier.Twister\score_16\0\team_16\1\deaths_17\1\keyhash_17\560718e3cf556cc22cb16c1b89dc6f4f\kills_17\0\ping_17\38\playername_17\JMG HUNdkreuzer RATTE\score_17\0\team_17\1\deaths_18\1\keyhash_18\7de8c7329f42eb8566c1c7c7ff79a1ca\kills_18\0\ping_18\94\playername_18\MasterOfInsanity (RUS)\score_18\0\team_18\2\deaths_19\1\keyhash_19\dd930e36a94fb35ab77800dedd1c4557\kills_19\3\ping_19\32\playername_19\Blitzkrieg Bob\score_19\5\team_19\1\deaths_20\0\keyhash_20\937d4a7ce628a8ee054f9fcbfe64be9b\kills_20\0\ping_20\445\playername_20\~yu~\score_20\0\team_20\1\deaths_21\0\keyhash_21\c71f4eeff78a84344d2185f1e8510c16\kills_21\0\ping_21\43\playername_21\molchomor\score_21\0\team_21\1\deaths_22\0\queryid\4111.3
    ma méthode:
    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
    Procedure TForm1.Button3Click(Sender: TObject);
    Var
      sline:  String;
      Search: TStringList;
      I:      Integer;
    Begin
      Search := TStringList.Create;
      Try
        Search.LineBreak := '\';
        Search.Text      := '\deaths_0\2\keyhash_0\a7a2f8801c3ae110aa3fbfee9d143abd\kills_0\0\ping_0\36\playername_0\ pingu\score_0\2\team_0\2\deaths_1\1\keyhash_1' +
          '\817e7928c5dd97272dbd06be707d2cdf\kills_1\5\ping_1\40\playername_1\Buheheporcodio\score_1\5\team_1\2\deaths_2\0\keyhash_2\945c3160a248eb886dc83e5613d96857\kills_2\8\ping_2\49\playername_2\Torque.idk?' +
          '\score_2\8\team_2\2\deaths_3\0\keyhash_3\160aad8653fb32fc7f49e29bc9695e1d\kills_3\0\ping_3\22\playername_3\De Man Met De Bril\score_3\0\team_3\2\deaths_4\2\keyhash_4\7c857e50cb6fb289e45f4b000a275f75' +
          '\kills_4\1\ping_4\91\playername_4\Tom PL\score_4\1\team_4\2\deaths_5\0\keyhash_5\2c52ef003c6179bb9d7d827105ec7961\kills_5\0\ping_5\72\playername_5\NT|Archon' +
          '\score_5\0\team_5\1\deaths_6\1\keyhash_6\1c3d869b0ca0962b2aa557dfe732dfc1\kills_6\0\ping_6\42\playername_6\Frederick Zoller\score_6\0\team_6\1\deaths_7\1\keyhash_7\f7761448739de0f4b223b8c1a75c2c9e' +
          '\kills_7\0\ping_7\56\playername_7\Da Stuten Andi\score_7\0\team_7\1\deaths_8\2\keyhash_8\989022adc2dbfb30a269df4eeb09c649\kills_8\0\ping_8\137\playername_8\Twan' +
          '\score_8\0\team_8\1\deaths_9\1\keyhash_9\f1c1d56abeb6b53015b5641c6b3dee2a\kills_9\2\ping_9\78\playername_9\[301]Fabiolo\score_9\2\team_9\1\deaths_10\0\keyhash_10\376cbea5eff00ae78ef2b0cd14a7770c' +
          '\kills_10\1\ping_10\69\playername_10\AlFaMaNiAc\score_10\1\team_10\1\deaths_11\2\queryid\4111.1\keyhash_11\6dcba9dc3f85c6e17c6c57e15675c3dd\kills_11\0\ping_11\76\queryid\4111.2\playername_11\ZZZZZZZzzzzzzz' +
          '\score_11\0\team_11\1\deaths_12\0\keyhash_12\5a1d27377560193263af744ebc90642d\kills_12\6\ping_12\56\playername_12\Wulz\score_12\6\team_12\2\deaths_13\1\keyhash_13\6c8370c10eba124af9ff47a994d8470a\kills_13\1' +
          '\ping_13\66\playername_13\**Ñ** sergioten\score_13\1\team_13\1\deaths_14\1\keyhash_14\50c5fdf9de1dacf1277d3b680271e65d\kills_14\0\ping_14\66\playername_14\Napl3tek\score_14\0\team_14\1\deaths_15\1\keyhash_15' +
          '\e999bedeeb4962ba3d6b298b11e2b732\kills_15\4\ping_15\54\playername_15\the Wiesel\score_15\4\team_15\1\deaths_16\1\keyhash_16\2c0228ccbadfb30f7a8b913651107747\kills_16\0\ping_16\40\playername_16\Soldier.Twister' +
          '\score_16\0\team_16\1\deaths_17\1\keyhash_17\560718e3cf556cc22cb16c1b89dc6f4f\kills_17\0\ping_17\38\playername_17\JMG HUNdkreuzer RATTE\score_17\0\team_17\1\deaths_18\1\keyhash_18\7de8c7329f42eb8566c1c7c7ff79a1ca' +
          '\kills_18\0\ping_18\94\playername_18\MasterOfInsanity (RUS)\score_18\0\team_18\2\deaths_19\1\keyhash_19\dd930e36a94fb35ab77800dedd1c4557\kills_19\3\ping_19\32\playername_19\Blitzkrieg Bob\score_19\5\team_19\1\deaths_20' +
          '\0\keyhash_20\937d4a7ce628a8ee054f9fcbfe64be9b\kills_20\0\ping_20\445\playername_20\~yu~\score_20\0\team_20\1\deaths_21\0\keyhash_21\c71f4eeff78a84344d2185f1e8510c16\kills_21\0\ping_21\43\playername_21\molchomor\score_21' +
          '\0\team_21\1\deaths_22\0\queryid\4111.3';
        I                := Search.IndexOf('queryid');
        While I <> -1 Do
        Begin
          Search.Delete(I);
          Search.Delete(I);
          I := Search.IndexOf('queryid');
        End;
        memo1.Text := Search.Text;
      Finally
        Search.Free;
      End;
    End;

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Salut,

    en combien de temps s'exécute ton traitement ? si c'est en ms alors que veut-dire rapide pour toi ? sauf si ton fichier fais des Go.

  3. #3
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Salut,

    Avais-tu pensé à regarder ce que donnerait cela en t'appuyant sur l'algo de recherche à Gilbert :

    http://www.developpez.net/forums/d85...e-boyer-moore/

    @+

  4. #4
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut
    la chaine peut faire 3x la taille que j'ai mis et plusieurs milliers à la suite 3000. Sa c'est le maximum.

    le prob c'est la partie bleu pour utiliser l'algo de recherche à Gilbert

    sur un core2duo 2.4 je met 3sec pour 2000 passes c'est beaucoup non, parceque sa c'est sans compter la récup de données et la decoupe etc donc si je peut grapiller
    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
    Procedure TForm1.Button3Click(Sender: TObject);
    Var
      Search:    TStringList;
      I, iPasse: Integer;
      cTime:     Cardinal;
    Begin
      cTime := GetTickCount;
      For iPasse := 0 To 2000 Do
      Begin
        Search := TStringList.Create;
        Try
          Search.LineBreak := '\';
          Search.Text      := '\deaths_0\2\keyhash_0\a7a2f8801c3ae110aa3fbfee9d143abd\kills_0\0\ping_0\36\playername_0\ pingu\score_0\2\team_0\2\deaths_1\1\keyhash_1' +
            '\817e7928c5dd97272dbd06be707d2cdf\kills_1\5\ping_1\40\playername_1\Buheheporcodio\score_1\5\team_1\2\deaths_2\0\keyhash_2\945c3160a248eb886dc83e5613d96857\kills_2\8\ping_2\49\playername_2\Torque.idk?' +
            '\score_2\8\team_2\2\deaths_3\0\keyhash_3\160aad8653fb32fc7f49e29bc9695e1d\kills_3\0\ping_3\22\playername_3\De Man Met De Bril\score_3\0\team_3\2\deaths_4\2\keyhash_4\7c857e50cb6fb289e45f4b000a275f75' +
            '\kills_4\1\ping_4\91\playername_4\Tom PL\score_4\1\team_4\2\deaths_5\0\keyhash_5\2c52ef003c6179bb9d7d827105ec7961\kills_5\0\ping_5\72\playername_5\NT|Archon' +
            '\score_5\0\team_5\1\deaths_6\1\keyhash_6\1c3d869b0ca0962b2aa557dfe732dfc1\kills_6\0\ping_6\42\playername_6\Frederick Zoller\score_6\0\team_6\1\deaths_7\1\keyhash_7\f7761448739de0f4b223b8c1a75c2c9e' +
            '\kills_7\0\ping_7\56\playername_7\Da Stuten Andi\score_7\0\team_7\1\deaths_8\2\keyhash_8\989022adc2dbfb30a269df4eeb09c649\kills_8\0\ping_8\137\playername_8\Twan' +
            '\score_8\0\team_8\1\deaths_9\1\keyhash_9\f1c1d56abeb6b53015b5641c6b3dee2a\kills_9\2\ping_9\78\playername_9\[301]Fabiolo\score_9\2\team_9\1\deaths_10\0\keyhash_10\376cbea5eff00ae78ef2b0cd14a7770c' +
            '\kills_10\1\ping_10\69\playername_10\AlFaMaNiAc\score_10\1\team_10\1\deaths_11\2\queryid\4111.1\keyhash_11\6dcba9dc3f85c6e17c6c57e15675c3dd\kills_11\0\ping_11\76\queryid\4111.2\playername_11\ZZZZZZZzzzzzzz' +
            '\score_11\0\team_11\1\deaths_12\0\keyhash_12\5a1d27377560193263af744ebc90642d\kills_12\6\ping_12\56\playername_12\Wulz\score_12\6\team_12\2\deaths_13\1\keyhash_13\6c8370c10eba124af9ff47a994d8470a\kills_13\1' +
            '\ping_13\66\playername_13\**Ñ** sergioten\score_13\1\team_13\1\deaths_14\1\keyhash_14\50c5fdf9de1dacf1277d3b680271e65d\kills_14\0\ping_14\66\playername_14\Napl3tek\score_14\0\team_14\1\deaths_15\1\keyhash_15' +
            '\e999bedeeb4962ba3d6b298b11e2b732\kills_15\4\ping_15\54\playername_15\the Wiesel\score_15\4\team_15\1\deaths_16\1\keyhash_16\2c0228ccbadfb30f7a8b913651107747\kills_16\0\ping_16\40\playername_16\Soldier.Twister' +
            '\score_16\0\team_16\1\deaths_17\1\keyhash_17\560718e3cf556cc22cb16c1b89dc6f4f\kills_17\0\ping_17\38\playername_17\JMG HUNdkreuzer RATTE\score_17\0\team_17\1\deaths_18\1\keyhash_18\7de8c7329f42eb8566c1c7c7ff79a1ca' +
            '\kills_18\0\ping_18\94\playername_18\MasterOfInsanity (RUS)\score_18\0\team_18\2\deaths_19\1\keyhash_19\dd930e36a94fb35ab77800dedd1c4557\kills_19\3\ping_19\32\playername_19\Blitzkrieg Bob\score_19\5\team_19\1\deaths_20' +
            '\0\keyhash_20\937d4a7ce628a8ee054f9fcbfe64be9b\kills_20\0\ping_20\445\playername_20\~yu~\score_20\0\team_20\1\deaths_21\0\keyhash_21\c71f4eeff78a84344d2185f1e8510c16\kills_21\0\ping_21\43\playername_21\molchomor\score_21' +
            '\0\team_21\1\deaths_22\0\queryid\4111.3';
          I                := Search.IndexOf('queryid');
          While I <> -1 Do
          Begin
            Search.Delete(I);
            Search.Delete(I);
            I := Search.IndexOf('queryid');
          End;
          If iPasse = 2000 Then
            memo1.Text := Search.Text;
        Finally
          Search.Free;
        End;
      End;
      cTime := GetTickCount - cTime;
      MessageDlg(Format('Temps: %d ms', [cTime]), mtInformation, [mbOK], 0);
    End;

  5. #5
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    L'autre fois ici, j'avais vu une fonction de recherche super rapide en ASM, mais je ne pense pas avoir noté ce lien

    @+

  6. #6
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut
    asm je connais que le nom
    si il retourne la position de queryid je fait comment pour effacer aussi la partie bleu qui est variable, 3sec finalement c'est rapide

  7. #7
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Ce code prends 60ms avec ton exemple
    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
     uses strutils;
     
    type TNPos=record StartPos, sLength:integer end;
         PNPos =^TNPos;
    function DeleteStr(const Substr,Str:string):string;
    var
       PNPosVar:PNPos;
       I,J,Ne,Len:integer;
       List :TList;
    begin
       I:=1;
       Len :=0;
       result :='';
       List :=TList.Create;
       try
           Ne:=Length(SubStr);
           repeat
              J:= PosEx(substr,Str,I);
     
              if J= 0 then Break;
     
              New(PNPosVar);
              PNPosVar^.StartPos:=I;
              PNPosVar^.sLength :=J-I;
              List.Add(PNPosVar);
              I:=J+ Ne;
     
           until False;
     
              New(PNPosVar);
              PNPosVar^.StartPos:=I;
              PNPosVar^.sLength :=(Length(Str)-I)+1;
              List.Add(PNPosVar);
     
           for I := 0 to List.Count-1 do
              Len:=Len+ TNPos(List[I]^).sLength;
     
     
     
           if Len <> 0 then
           begin
               Setlength(result,Len);
               J:=1;
               for I := 0 to List.Count-1 do
               with TNPos(List[I]^) do
               begin
                  Move(Str[StartPos],result[J],sLength);
                  inc(J,sLength);
               end;
           end;
       finally
          List.Free();
       end;
    end;
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          memo1.Lines.Delimiter :='\';
          memo1.Lines.DelimitedText :=  DeleteStr('\queryid',S);

  8. #8
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 992
    Par défaut
    merci, chez moi sa met 69sec, et sa n'efface que queryid et pas la partie bleu de l'exemple qui change à chaque fois.

    je l'est utilisé comme sa:
    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
    Procedure TForm1.Button3Click(Sender: TObject);
    Var
      Search:    TStringList;
      I, iPasse: Integer;
      cTime:     Cardinal;
    Begin
      cTime := GetTickCount;
      For iPasse := 0 To 2000 Do
      Begin
    //    Search := TStringList.Create;
    //    Try
    //      Search.LineBreak := '\';
    //      Search.Text      :=
          memo1.Lines.Delimiter :='\';
          memo1.Lines.DelimitedText :=  DeleteStr('\queryid','\deaths_0\2\keyhash_0\a7a2f8801c3ae110aa3fbfee9d143abd\kills_0\0\ping_0\36\playername_0\ pingu\score_0\2\team_0\2\deaths_1\1\keyhash_1' +
            '\817e7928c5dd97272dbd06be707d2cdf\kills_1\5\ping_1\40\playername_1\Buheheporcodio\score_1\5\team_1\2\deaths_2\0\keyhash_2\945c3160a248eb886dc83e5613d96857\kills_2\8\ping_2\49\playername_2\Torque.idk?' +
            '\score_2\8\team_2\2\deaths_3\0\keyhash_3\160aad8653fb32fc7f49e29bc9695e1d\kills_3\0\ping_3\22\playername_3\De Man Met De Bril\score_3\0\team_3\2\deaths_4\2\keyhash_4\7c857e50cb6fb289e45f4b000a275f75' +
            '\kills_4\1\ping_4\91\playername_4\Tom PL\score_4\1\team_4\2\deaths_5\0\keyhash_5\2c52ef003c6179bb9d7d827105ec7961\kills_5\0\ping_5\72\playername_5\NT|Archon' +
            '\score_5\0\team_5\1\deaths_6\1\keyhash_6\1c3d869b0ca0962b2aa557dfe732dfc1\kills_6\0\ping_6\42\playername_6\Frederick Zoller\score_6\0\team_6\1\deaths_7\1\keyhash_7\f7761448739de0f4b223b8c1a75c2c9e' +
            '\kills_7\0\ping_7\56\playername_7\Da Stuten Andi\score_7\0\team_7\1\deaths_8\2\keyhash_8\989022adc2dbfb30a269df4eeb09c649\kills_8\0\ping_8\137\playername_8\Twan' +
            '\score_8\0\team_8\1\deaths_9\1\keyhash_9\f1c1d56abeb6b53015b5641c6b3dee2a\kills_9\2\ping_9\78\playername_9\[301]Fabiolo\score_9\2\team_9\1\deaths_10\0\keyhash_10\376cbea5eff00ae78ef2b0cd14a7770c' +
            '\kills_10\1\ping_10\69\playername_10\AlFaMaNiAc\score_10\1\team_10\1\deaths_11\2\queryid\4111.1\keyhash_11\6dcba9dc3f85c6e17c6c57e15675c3dd\kills_11\0\ping_11\76\queryid\4111.2\playername_11\ZZZZZZZzzzzzzz' +
            '\score_11\0\team_11\1\deaths_12\0\keyhash_12\5a1d27377560193263af744ebc90642d\kills_12\6\ping_12\56\playername_12\Wulz\score_12\6\team_12\2\deaths_13\1\keyhash_13\6c8370c10eba124af9ff47a994d8470a\kills_13\1' +
            '\ping_13\66\playername_13\**Ñ** sergioten\score_13\1\team_13\1\deaths_14\1\keyhash_14\50c5fdf9de1dacf1277d3b680271e65d\kills_14\0\ping_14\66\playername_14\Napl3tek\score_14\0\team_14\1\deaths_15\1\keyhash_15' +
            '\e999bedeeb4962ba3d6b298b11e2b732\kills_15\4\ping_15\54\playername_15\the Wiesel\score_15\4\team_15\1\deaths_16\1\keyhash_16\2c0228ccbadfb30f7a8b913651107747\kills_16\0\ping_16\40\playername_16\Soldier.Twister' +
            '\score_16\0\team_16\1\deaths_17\1\keyhash_17\560718e3cf556cc22cb16c1b89dc6f4f\kills_17\0\ping_17\38\playername_17\JMG HUNdkreuzer RATTE\score_17\0\team_17\1\deaths_18\1\keyhash_18\7de8c7329f42eb8566c1c7c7ff79a1ca' +
            '\kills_18\0\ping_18\94\playername_18\MasterOfInsanity (RUS)\score_18\0\team_18\2\deaths_19\1\keyhash_19\dd930e36a94fb35ab77800dedd1c4557\kills_19\3\ping_19\32\playername_19\Blitzkrieg Bob\score_19\5\team_19\1\deaths_20' +
            '\0\keyhash_20\937d4a7ce628a8ee054f9fcbfe64be9b\kills_20\0\ping_20\445\playername_20\~yu~\score_20\0\team_20\1\deaths_21\0\keyhash_21\c71f4eeff78a84344d2185f1e8510c16\kills_21\0\ping_21\43\playername_21\molchomor\score_21' +
            '\0\team_21\1\deaths_22\0\queryid\4111.3');
    //      I                := Search.IndexOf('queryid');
    //      While I <> -1 Do
    //      Begin
    //        Search.Delete(I);
    //        Search.Delete(I);
    //        I := Search.IndexOf('queryid');
    //      End;
    //      If iPasse = 2000 Then
    //        memo1.Text := Search.Text;
    //    Finally
    //      Search.Free;
    //    End;
      End;
      cTime := GetTickCount - cTime;
      MessageDlg(Format('Temps: %d ms', [cTime]), mtInformation, [mbOK], 0);
    End;
    j'ai aussi un memory leak
    1 - 12 bytes: Unknown x 8004

  9. #9
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    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
    function DeleteStr(const Str:string):string;
    var
       PNPosVar:PNPos;
       I,B,J,Ne,Len:integer;
       List :TList;
       Substr:string;
    begin
       I:=1;
       Len :=0;
       result :='';
       Substr :='\queryid\';
       List :=TList.Create;
       try
           Ne:=Length(SubStr);
           repeat
              J:= PosEx(substr,Str,I);
     
              if J= 0 then Break;
     
              B:= PosEx('\',Str,J+Ne);
              if B= 0 then
                 B:=Length(Str)+1;
     
              New(PNPosVar);
              PNPosVar^.StartPos:=I;
              PNPosVar^.sLength :=J-I;
              List.Add(PNPosVar);
              I:=B;
     
           until False;
     
              New(PNPosVar);
              PNPosVar^.StartPos:=I;
              PNPosVar^.sLength :=(Length(Str)-I)+1;
              List.Add(PNPosVar);
     
           for I := 0 to List.Count-1 do
              Len:=Len+ TNPos(List[I]^).sLength;
     
     
     
           if Len <> 0 then
           begin
               Setlength(result,Len);
               J:=1;
               for I := 0 to List.Count-1 do
               with TNPos(List[I]^) do
               begin
                  Move(Str[StartPos],result[J],sLength);
                  inc(J,sLength);
               end;
           end;
     
           for I := 0 to List.Count-1 do
              Dispose(List[I]);
     
       finally
          List.Free();
       end;
    end;
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memo1.Lines.DelimitedText :=  DeleteStr(S);
    pour la fuite de memoire il a fallut juste libérer les record sur la Tlist
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           for I := 0 to List.Count-1 do
              Dispose(List[I]);

  10. #10
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Citation Envoyé par ouiouioui Voir le message
    asm je connais que le nom
    Je ne crois pas que ce soit le code auquel je pensais en premier.

    Lien de ce code :
    http://www.jplamon.com/delphi/tips.htm

    Code ASM : 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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    // Case avec des strings (Pascal Peyremorte)
     
    FUNCTION ChercheTexte(Const Chaine,Texte:ShortString):Integer; Assembler;
    Var
        Table : Array[Byte] of Byte;
    Asm
        push  edi        {Il faut conserver EDI, ESI, EBX, ESP et EBP}
        push  esi
        push  ebx
        cld
     
        {Récupère longueur(eax) et adresse(esi) de Chaine}
        mov   esi,Chaine
        xor   eax,eax    {Pour conversion byte -> 32b}
        lodsb            {Récup longueur Chaine et pointe premier car}
        or    al,al      {Si longueur=0 : Exit}
        jz    @Inconnue
     
        {Récupère longueur(ecx) et adresse(edi) de Texte}
        mov   edi,Texte
        xor   ecx,ecx    {Pour conversion byte -> 32b}
        mov   cl,[edi]   {Récup longueur Texte}
        jcxz  @Inconnue  {Si longueur=0 : Exit}
        inc   edi        {Saute l'octet longueur et pointe premier car}
     
        {Si Long(Chaine)=1, c'est 1 caractère -> recherche simplifiée}
        cmp   eax,1
        jne   @Boyer_Moore
     
    {--- Recherche simplifiée ---}
        lodsb            {Récupère l'unique caractère de Chaine}
        repne scasb      {et le cherche dans Texte}
        jnz   @Inconnue  {pas trouvé, exit}
     
        mov   esi,edi
        sub   esi,2
        jmp   @Corresp
     
    {--- Recherche Boyer-Moore ---}
    @Boyer_Moore:
     
        push  edi        {on aura besoin de @ du premier car de Texte}
        mov   edx,ecx    {et de longueur de Texte plus loin}
     
        {Remplis le tableau avec la longueur de Chaine}
        lea   edi,Table  {ebx Pointe la table des sauts}
        mov   ah,al      {AH = AL = Longueur de Chaine}
        mov   ecx,128    {taille de table des sauts / 2 (écrit des words)}
        rep   stosw      {remplis avec longueur de Chaine, ecx=0 en fin de bcle}
     
        {Place dans la table(Car) la distance entre Car et fin de Chaine -1}
        xor   ah,ah
        mov   ecx,eax    {ecx = Longueur Chaine-1}
        dec   ecx
        push  ecx        {on a besoin de longueur(Chaine)-1 plus loin}
     
        lea   ebx,Table  {ebx = @Table des sauts, esi pointe encore début de Chaine}
    @Remplis:
        lodsb            {Récupère un car de Chaine}
        mov   [ebx+eax],cl {Met la distance à sauter}
        loop  @Remplis
        lodsb            {ecx=0 : idem pour dernier caractère}
        mov   [ebx+eax],cl
     
        {Initialise pointeurs pour recherche}
        std              {comparaisons à partir de la fin}
     
        dec   edx        {edx = Length(Texte)-1}
        pop   eax        {Récupère longueur(Chaine)-1 = longueur du premier saut}
        pop   esi        {esi pointe Texte, ebx pointe encore Table de sauts}
     
    @SautSuivant:
        sub   edx,eax    {Texte épuisé ?}
        jc    @Inconnue  {oui, pas de correspondance}
     
        add   esi,eax    {Avance pointeur du nbre de car à sauter}
        mov   al,[esi]   {Récup car pointé}
        mov   al,[ebx+eax] {et récup nbre de car à sauter dans table sauts}
        or    al,al      {Si 0, peut-être correspondance : compare chaines}
        jne   @SautSuivant
     
        {Occurence possible, compare les chaines}
        mov   eax,esi    {Sauve Pointeur dans Texte}
        dec   esi       {saute le caractère comparé (indirectement via table)}
     
        mov   edi,Chaine {Pointe chaine à rechercher}
        mov   cl,[edi]   {et ecx = longueur à comparer}
        dec   ecx        {dernier car déjà testé}
        add   edi,ecx    {edi pointe avant dernier car de Chaine}
        repe  cmpsb      {compare à rebrousse-poil}
        je    @Corresp   {Egales : correspondance trouvée !}
     
        mov   esi,eax    {Sinon récupère pointeur dans Texte}
        mov   eax,1      {Sautera 1 seul caractère}
        jmp   @SautSuivant
     
    @Corresp:
        mov   eax,esi    {Récup position dans Texte}
        sub   eax,Texte  {Ôte adresse de début de Texte+2}
        inc   eax
        cld
        jmp   @Fin
     
    @Inconnue:
        xor   eax,eax    {Pas d'occurence, retourne 0}
     
    @Fin:
        pop   ebx
        pop   esi
        pop   edi
    End;

    @+

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

Discussions similaires

  1. Sqlite - Problème de delete, string primary key
    Par lyes312 dans le forum Android
    Réponses: 6
    Dernier message: 20/07/2011, 15h26
  2. DELETE très lent : Optimisation ?
    Par kornelius dans le forum Développement
    Réponses: 7
    Dernier message: 05/11/2009, 10h07
  3. delete tableau de string
    Par mathher dans le forum C++
    Réponses: 9
    Dernier message: 19/04/2006, 18h00
  4. Optimisation de DELETE
    Par RitonLaBevue dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/11/2005, 15h31
  5. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37

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