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 :

Y-a-t-il plus rapide pour enlever les accents ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut Y-a-t-il plus rapide pour enlever les accents ?
    Bonjour,

    quelqu'un aurait-il une fonction/procedure pour supprimer les accents plus rapide que celle-ci que j'ai trouvé sur ce forum ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function EnleveAccents(AText : String) : string;
    const 
      Char_Accents      = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ';
      Char_Sans_Accents = 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn';
    var
      I : Integer;
      sTemp : String;
    begin
      sTemp := AText;
      For i := 1 to Length(Char_Accents) do
        //sTemp := FastReplace(sTemp, Char_Accents[i], Char_Sans_Accents[i]);
        sTemp := StringReplace(sTemp,Char_Accents[i],Char_Sans_Accents[i],[rfReplaceAll]);
      Result := sTemp;
    end;
    Amicalement,
    Bruno

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Voici une version rafraîchie d'une fonction que j'ai écrite il y a plus de quinze ans. Elle passe la chaîne en majuscule, et traite aussi les ae et oe collés, chose à laquelle on pense rarement. Elle devrait être plus rapide que d'invoquer StringReplace pour chaque caractère d'un tableau. Si tu n'as pas besoin du passage en majuscules, tu devrais pouvoir la modifier facilement.

    Sinon, on pourrait faire un tableau complet de caractères désaccentués indexés par les caractères de #0 à #255. Peut-être demain si j'ai le temps.

    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
    Function DTUpperStringRemovingSpecials(s:string):string;
    var i:integer;
    begin
     i:=1;
     while i<=length(s) do
      begin
       case s[i] of 'Œ','œ':begin
                             s[i]:='O';
                             insert('E',s,i+1);
                             inc(i);
                            end;
                    'Æ','æ':begin
                             s[i]:='A';
                             insert('E',s,i+1);
                             inc(i);
                            end;
                    'Š','š':s[i]:='S';
                    'Ç','ç':s[i]:='C';
                    'Ñ','ñ':s[i]:='N';
                    'Ð':s[i]:='D';
                    'Ÿ','Ý','ý','ÿ':s[i]:='Y';
                    'À'..'Å','à'..'å':s[i]:='A';
                    'È'..'Ë','è'..'ë':s[i]:='E';
                    'Ì'..'Ï','ì'..'ï':s[i]:='I';
                    'Ò'..'Ö','Ø','ò'..'ö','ø':s[i]:='O';
                    'Ù'..'Ü','ù'..'ü':s[i]:='U';
         end;
       inc(i);
       end;
     Result:=s;
    end;

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    LE plus rapide de plus rapide de chez carambar, c'est un tableau de conversion.

    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
     
    var
     SansAccent:array[#0..#255] of char;
     
    // initialiser le tableau avec une méthode classique pas forcément rapide
    // ou déclarer un tableau constant, peu importe pour la suite
     
    function EnleveAccents(const AText : String) : string;
    var
     i:integer;
    begin
     Result:=AText;
     for i:=1 to Length(Result) do Result[i]:=SansAccent[Result[i]];
    end;
     
    // ou la version PChar qui évite l'indexation 
     
    function EnleveAccents(const AText : String) : string;
    var
     i:integer;
     p:pchar;
    begin
     Result:=AText;
     if Result='' then exit;
     p:=@Result[1];
     for i:=1 to Length(Result) do begin
      p^:=SansAccent[p^]; 
      inc(p);
     end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Oui, c'est ce que je disais, mais "tableau de conversion", c'est plus simple que "tableau de caractères désaccentués machin truc", c'est clair.

    Une question : il y a une raison réelle à l'utilisation d'un PChar pour accéder aux caractères ? Est-ce plus rapide que s[i] := convert[s[i]] ?

  5. #5
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Bon, je viens de faire quelques tests, et c'est très surprenant !

    Première série de tests : on ne tient pas compte des voyelles accolées.

    Nous avons d'abord (j'ai optimisé aussi avec un PChar ) :

    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
    function EnleveAccentsCaseOf(const S : String) : string;
    var i:integer;p:PChar;
    begin
     Result := S;
     if Result='' then exit;
     p:=@Result[1];
     for i:=1 to length(S) do
      begin
       case p^ of 'À'..'Å'      : p^ := 'A';
                  'à'..'å'      : p^ := 'a';
                  'È'..'Ë'      : p^ := 'E';
                  'è'..'ë'      : p^ := 'e';
                  'Ì'..'Ï'      : p^ := 'I';
                  'ì'..'ï'      : p^ := 'i';
                  'Ò'..'Ö','Ø'  : p^ := 'O';
                  'ò'..'ö','ø'  : p^ := 'o';
                  'Ù'..'Ü'      : p^ := 'U';
                  'ù'..'ü'      : p^ := 'u';
                  'Š'           : p^ := 'S';
                  'š'           : p^ := 's';
                  'Ç'           : p^ := 'C';
                  'ç'           : p^ := 'c';
                  'Ñ'           : p^ := 'N';
                  'ñ'           : p^ := 'n';
                  'Ð'           : p^ := 'D';
                  'ð'           : p^ := 'd';
                  'Ÿ','Ý'       : p^ := 'Y';
                  'ý','ÿ'       : p^ := 'y';
                  'ž'           : p^ := 'z';
                  'Ž'           : p^ := 'Z';
             end;
        inc(p);
       end;
    end;
    et, en combinant les idées de tout le monde :

    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
    const
     SansAccents : array[#0..#255] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                    '`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
                    'aaaaaaæceeeeiiiidnooooo÷ouuuuyþy';
     
    function EnleveAccentsConversion(const AText : String) : string;
    var
     i:integer;
     p:pchar;
    begin
     Result:=AText;
     if Result='' then exit;
     p:=@Result[1];
     for i:=1 to Length(Result) do begin
      p^:=SansAccents[p^];
      inc(p);
     end;
    end;
    Eh bien les résultats ne sont pas aussi tranchés que ça ! En effet, si la deuxième fonction est jusqu'à deux fois plus rapide que la première dans le cas abstrait de la chaîne contenant les 256 caractères possibles, elle n'est pas beaucoup plus rapide dans le cas d'une phrase en français contenant un nombre normal d'accents ! En fait, les temps sont sensiblement égaux, ce qui m'a beaucoup surpris.

    Par contre les deux sont 10 à 20 fois plus rapides que celle qui qui a servi d'introduction au fil.

  6. #6
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Deuxième série de tests : on remplace les voyelles accolées par des voyelles séparées.

    Première fonction (ici, à mon avis, on n'échappe pas à l'indexation, ou alors il faut de l'assembleur...)

    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
    function EnleveAccentsCaseOfDoubles(const S : String) : string;
    var i:integer;
    begin
     Result := S;
     i:=1;
     while i<=length(s) do
      begin
       case s[i] of 'À'..'Å'     : Result[i]:='A';
                    'à'..'å'     : Result[i]:='a';
                    'È'..'Ë'     : Result[i]:='E';
                    'è'..'ë'     : Result[i]:='e';
                    'Ì'..'Ï'     : Result[i]:='I';
                    'ì'..'ï'     : Result[i]:='i';
                    'Ò'..'Ö','Ø' : Result[i]:='O';
                    'ò'..'ö','ø' : Result[i]:='o';
                    'Ù'..'Ü'     : Result[i]:='U';
                    'ù'..'ü'     : Result[i]:='u';
                    'Š'          : Result[i]:='S';
                    'š'          : Result[i]:='s';
                    'Ç'          : Result[i]:='C';
                    'ç'          : Result[i]:='c';
                    'Ñ'          : Result[i]:='N';
                    'ñ'          : Result[i]:='n';
                    'Ð'          : Result[i]:='D';
                    'Ÿ','Ý'      : Result[i]:='Y';
                    'ý','ÿ'      : Result[i]:='y';
                    'ð'          : Result[i]:='d';
                    'ž'          : Result[i]:='z';
                    'Ž'          : Result[i]:='Z';
                    'Œ'    :begin
                             Result[i]:='O';
                             insert('E',Result,i+1);
                             inc(i);
                            end;
                    'œ'    :begin
                             Result[i]:='o';
                             insert('e',Result,i+1);
                             inc(i);
                            end;
                    'Æ'    :begin
                             Result[i]:='A';
                             insert('E',Result,i+1);
                             inc(i);
                            end;
                    'æ'    :begin
                             Result[i]:='a';
                             insert('e',Result,i+1);
                             inc(i);
                            end;
                         end;
       inc(i);
       end;
    end;
    Deuxième 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
    const
     SansAccents : array[#0..#255] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                    '`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
                    'aaaaaaæceeeeiiiidnooooo÷ouuuuyþy';
     
    function EnleveAccentsConversionDoubles(const AText : String) : string;
    var
     i:integer;
     p:pchar;
    begin
     Result:=AText;
     if Result='' then exit;
     p:=@Result[1];
     for i:=1 to Length(Result) do begin
      p^:=SansAccents[p^];
      inc(p);
     end;
     i:=pos('Œ',Result);
     while i>0 do
      begin Result[i]:='O';insert('E',Result,i+1);i:=pos('Œ',Result); end;
     i:=pos('œ',Result);
     while i>0 do
      begin Result[i]:='o';insert('e',Result,i+1);i:=pos('œ',Result); end;
     i:=pos('Æ',Result);
     while i>0 do
      begin Result[i]:='A';insert('E',Result,i+1);i:=pos('Æ',Result); end;
     i:=pos('æ',Result);
     while i>0 do
      begin Result[i]:='a';insert('e',Result,i+1);i:=pos('æ',Result); end;
    end;
    Eh bien, ici, la solution avec CaseOf est 1,5 fois plus rapide que celle du tableau de conversion !

    Comme disait le regretté Professeur Cyclopède : "étonnant, non ?".

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    la solution avec CaseOf est 1,5 fois plus rapide que celle du tableau de conversion !
    Evidemment, l'utilisation du Pos au lieu d'un PosEx, ou d'un StringReplace fait maison sans API, provoque un balayage systématique
    Le fait de faire pour tous les caractères un "p^:=SansAccents[p^]" rajoute une opération assembleur, alors que le case ne le fait que lorsque cela est utile mais ce temps doit être consommé par les imbrications de if (case) au lieu d'un simple "alias" dans un tableau ...

    Le fameux insert pour un caractère double, c'est ce qui consomme le plus temps ... est-ce prix en compte par ton test CapJack ?

    ensuite juste pour une question de style, on peut déclarer ceci ? non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SansAccents : array[Char] of Char
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour à tous,

    A toutes fins utiles, voiçi une fonction en Asm dérivée de la fonction StrUpper de Borland :
    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
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
     
    //--- Conversion Majuscules et minuscules en Majuscules Non Accentuées :
     
    const LigAccents = 'ŠŒšœŸ¡ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ'
                      +'àáâãäåæçèéêëìíîïðñòóôõöøùúûü';
     
    function StrUpperMNA(Str: PChar): PChar; assembler;
    asm
            PUSH    ESI
            MOV     ESI,Str
            MOV     EDX,Str
    @@1:    LODSB
            OR      AL,AL
            JE      @@2
            CMP     AL,'a'
            JB      @@1
            CMP     AL,'z'
            ja      @@Accent
            SUB     AL,20H  // 32
            MOV     [ESI-1],AL
            jmp     @@1
    @@Accent:
            cmp     al,'à'
            je      @@A
            cmp     al,'á'
            je      @@A
            cmp     al,'â'
            je      @@A
            cmp     al,'ã'
            je      @@A
            cmp     al,'ä'
            je      @@A
            cmp     al,'å'
            je      @@A
            cmp     al,'æ'
            je      @@A
            cmp     al,'À'
            je      @@A
            cmp     al,'Á'
            je      @@A
            cmp     al,'Â'
            je      @@A
            cmp     al,'Ã'
            je      @@A
            cmp     al,'Ä'
            je      @@A
            cmp     al,'Å'
            je      @@A
            cmp     al,'Æ'
            je      @@A     // Fin des A
            cmp     al,'è'
            je      @@E
            cmp     al,'é'
            je      @@E
            cmp     al,'ê'
            je      @@E
            cmp     al,'ë'
            je      @@E
            cmp     al,'œ'
            je      @@E
            cmp     al,'È'
            je      @@E
            cmp     al,'É'
            je      @@E
            cmp     al,'Ê'
            je      @@E
            cmp     al,'Ë'
            je      @@E
            cmp     al,'Œ'
            je      @@E      // Fin des E
            cmp     al,'ì'
            je      @@I
            cmp     al,'í'
            je      @@I
            cmp     al,'ì'
            je      @@I
            cmp     al,'î'
            je      @@I
            cmp     al,'ï'
            je      @@I
            cmp     al,'¡'
            je      @@I
            cmp     al,'Ì'
            je      @@I
            cmp     al,'Í'
            je      @@I
            cmp     al,'Î'
            je      @@I
            cmp     al,'Ï'
            je      @@I      // Fin des I
            cmp     al,'ò'
            je      @@O
            cmp     al,'ó'
            je      @@O
            cmp     al,'ô'
            je      @@O
            cmp     al,'õ'
            je      @@O
            cmp     al,'ö'
            je      @@O
            cmp     al,'ð'
            je      @@O
            cmp     al,'Ò'
            je      @@O
            cmp     al,'Ó'
            je      @@O
            cmp     al,'Ô'
            je      @@O
            cmp     al,'Õ'
            je      @@O
            cmp     al,'Ö'
            je      @@O      // Fin des O
            cmp     al,'ü'
            je      @@U
            cmp     al,'ù'
            je      @@U
            cmp     al,'ú'
            je      @@U
            cmp     al,'û'
            je      @@U
            cmp     al,'Ù'
            je      @@U
            cmp     al,'Ú'
            je      @@U
            cmp     al,'Û'
            je      @@U
            cmp     al,'Ü'
            je      @@U      // Fin des U
            cmp     al,'ç'
            je      @@C
            cmp     al,'Ç'
            je      @@C      // Fin des C
            cmp     al,'Ð'
            je      @@D      // Fin D
            cmp     al,'ñ'
            je      @@N
            cmp     al,'Ñ'
            je      @@N      // Fin N
            cmp     al,'ø'
            je      @@Phi
            cmp     al,'Ø'
            je      @@Phi    // Fin Ø
            cmp     al,'š'
            je      @@S
            cmp     al,'Š'
            je      @@S      // Fin S
            cmp     al,'ý'
            je      @@Y
            cmp     al,'ÿ'
            je      @@Y
            cmp     al,'Ý'
            je      @@Y
            cmp     al,'Ÿ'
            je      @@Y
            JMP     @@1
    @@A:    mov     al,'A'
            mov     [esi-1],al
            JMP     @@1
    @@E:    mov     al,'E'
            mov     [esi-1],al
            JMP     @@1
    @@I:    mov     al,'I'
            mov     [esi-1],al
            JMP     @@1
    @@O:    mov     al,'O'
            mov     [esi-1],al
            JMP     @@1
    @@U:    mov     al,'U'
            mov     [esi-1],al
            JMP     @@1
    @@C:    mov     al,'C'
            mov     [esi-1],al
            JMP     @@1
    @@D:    mov     al,'D'
            mov     [esi-1],al
            JMP     @@1
    @@N:    mov     al,'N'
            mov     [esi-1],al
            JMP     @@1
    @@Phi:  mov     al,'Ø'
            mov     [esi-1],al
            JMP     @@1
    @@S:    mov     al,'S'
            mov     [esi-1],al
            JMP     @@1
    @@Y:    mov     al,'Y'
            mov     [esi-1],al
            JMP     @@1
    @@2:    XCHG    EAX,EDX
            POP     ESI
    end; // StrUpperMNA
     
    // Utilisation
     
    procedure TForm1.bMajusculAsmClick(Sender: TObject);
    var       p1,p2 : PChar; S : string; i : integer; Chrono : oChrono;
    begin     memo1.clear;
              Chrono.Top;
              GetMem(p1, 1+Length(LigAccents));
              StrPCopy(p1, LigAccents);
              for i:=1 to 20000 do
              begin //S:=string(StrUpper(p1));  // version originale de Borland
                    S:=string(StrUpperMNA(p1)); // dérivé de StrUpper
              end;
              labChrono.caption:='Mis : '+FloatToStrf(Chrono.Mis,ffFixed,10,2)+' ms';
              // Avec Pentium III 1,13 Ghz :
              // StrUpper    : mis 16 à 17 ms pour convertir 20 000 fois la chaine LigAccents
              // StrUpperMNA : mis 18 à 20 ms pour convertir 20 000 fois la chaine LigAccents
              memo1.lines.Add(S);
              FreeMem(p1, 1+Length(LigAccents));
    end;
    ... je n'ai pas fait de tests comparatifs de vitesse avec les divers codes proposés ici, vu déjà leur nombre et vu que le hasard a voulu que je viens juste de terminer la mise au point de la fonction StrUpperMNA car l'Asm ce n'est pas ma tasse de thé (les parties du code de cette fonction qui sont entièrement en majuscules sont de Borland et les parties en minuscules sont de moi, donc si quelqu'un y voit un truc à simplifier pour l'accélérer n'hésitez pas à le signaler).
    A+
    Modif du 18/07/2007 : Remplacement du code d'appel (procedure TForm1.bMajAsmClick(Sender: TObject) à l'origine parfois d'un message d'erreur ) par une version rectifiée.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bonjour à tous,

    Je savais que ce type de fonction allait succiter des réponses agréables mais de là à en avoir autant et de si bonne qualité, là je dis merci MESSIEURS !

    Amicalement,
    Bruno

  10. #10
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Le fameux insert pour un caractère double, c'est ce qui consomme le plus temps ... est-ce prix en compte par ton test CapJack ?
    Oui, dans le deuxième test. C'est ça qui multiplie le temps par trois.

    Citation Envoyé par ShaiLeTroll
    ensuite juste pour une question de style, on peut déclarer ceci ? non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SansAccents : array[Char] of Char
    J'y pense jamais...

  11. #11
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par Gilbert Geyer
    ... je n'ai pas fait de tests comparatifs de vitesse
    J'aurais voulu le faire vu que j'ai tout sous la main mais je n'arrive pas à compiler ton code sous Delphi 2005. Il me met une erreur de "non concordance de taille d'opérande" sur la première comparaison avec un caractère accentué, et je ne comprends pas pourquoi.

    Citation Envoyé par Gilbert Geyer
    si quelqu'un y voit un truc à simplifier pour l'accélérer n'hésitez pas à le signaler).
    A+
    Il y a contradiction dans les termes : souvent accélérer est incompatible avec simplifier, et c'est ici le cas : les lettres accentuées se présentent par blocs (tous les "a" ensemble, etc..) : il faudrait tirer partie de cette particularité, et de préférence tant qu'à faire avec une démarche partiellement dichotomique pur accélérer encore la chose.

    Une remarque : le OE collé n'est absolument pas équivalent à un E (sinon les œufs deviennent des efs ), pas plus que le ae n'est équivalent à un A... et ce sera vrai "ad vitam aternam" euh... "ad vitam æternam", pardon.

    Autre chose : le ß allemand peut s'écrire avec un double S en majuscule.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut
    Bonjour,
    Voir aussi éventuellement la fonction Delphi WideLowerCase.
    Rectification
    Mille excuses, j'ai mal lu la question...

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A propos de ma fonction StrUpperMNA CapJack a écrit : sous Delphi 2005. Il me met une erreur de "non concordance de taille d'opérande" sur la première comparaison avec un caractère accentué, et je ne comprends pas pourquoi.
    ... (il y a encore pire car ce matin cette fonction marchait très bien et quand je me suis mis à faire des tests avec les autres codes du forum StrUpperMNA s'est subitement mise à envoyer le message d'erreur "Violation d'accès ..."
    ... elle s'est nouveau remise à fonctionner normalement quand j'ai supprimé à la fin de la const LigAccents les deux "y minuscules accentués" ... mais ça n'a duré qu'un moment puis elle s'est remise à envoyer le même message d'erreur ... Je viens d'ajouter un avertissement dans mon message de ce matin pour prévenir.)
    <- ce passage est devenu caduque suite à rectification du code d'appel de cette fonction qui n'était elle-même pas à l'origine du mesage d'erreur.
    Moi j'utilise Delphi 5 + Win98, par contre je n'ai jamais eu le message "non concordance de taille d'opérande".

    CapJack a écrit :
    Il y a contradiction dans les termes : souvent accélérer est incompatible avec simplifier, et c'est ici le cas : les lettres accentuées se présentent par blocs (tous les "a" ensemble, etc..) : il faudrait tirer partie de cette particularité, et de préférence tant qu'à faire avec une démarche partiellement dichotomique pur accélérer encore la chose.
    ... je veux bien, il faudrait à cet effet que je réunisse les conditions suivantes :
    (1) Tout d'abord que je trouve pourquoi StrUpperMNA marche un coup et pas la fois d'après)<- pb réglé.
    2) Que StrUpperMNA reste compétitive après rectification
    3) Que je pige le comment "tirer partie de cette particularité, et de préférence tant qu'à faire avec une démarche partiellement dichotomique pour accélérer encore la chose" et tout ça en ASM ... moi je sais tout juste bidouiller dans un code en Asm en partant d'un code qui marche au départ pour essayer d'en faire une variante ... mais rien n'empèche d'essayer faudrait déjà avoir un code Delphi-non-asm pour piger la démarche partiellement dichotomique précitée.

    CapJack a écrit :
    ... le OE collé n'est absolument pas équivalent à un E (sinon les œufs deviennent des efs ), pas plus que le ae n'est équivalent à un A... et ce sera vrai "ad vitam aternam" euh... "ad vitam æternam", pardon.
    ... pour "œufs" devient en fait "eufs" la phonétique est respectée et cela ne me gènerait donc pas trop.
    ... dans le même état d'esprit ce serait préférable de convertir ae plutôt en E qu'en A pour la phonétique.
    ... Par contre dans les deux cas si on veut supprimer la conversion de OE en E et AE en A ou en E ça au moins c'est facile à faire dans le code même en Asm.

    CapJack a écrit :
    Autre chose : le ß allemand peut s'écrire avec un double S en majuscule.
    ... comme dans la fonction en Asm on avance caractère par caractère faudrait donc y ajouter une fonction d'insertion de caractères pour insérer un 2ième S c'est donc pas pour rien que je n'ai pas converti le ß ... et en plus le ß grec devient B en majuscule ... et ça donnerait quoi en allemand le ß converti en B majuscule ? Acceptable, pas acceptable ?

    Au fait malgré mes déboires intermittents avec StrUpperMNA (déboires finis suite à rectif du 18/07) j'ai pu faire des essais comparatifs de vitesse avec les autres codes :
    Protocle d'essais : for i:=1 to 20000 do s:=EnleveAccentsPThot2(LigAccents);
    avec const LigAccents = 'ŠŒšœŸ¡ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ'
    +'àáâãäåæçèéêëìíîïðñòóôõöøùúûü';
    Donc pour cette boucle de 20 000 conversions les résultats ont été (Pentium III 1,13 Ghz ) :
    A) Code que Bruno13 demandait à optimiser : 5991 ms
    B) Codes de CapJack de 1 à 5 (n° correspondent à l'ordre chronologique d'apparition dans le forum):
    - CJ1 : 104 ms
    - CJ2 : 35 ms
    - CJ3 : 14 ms
    - CJ4 : 91 ms
    - CJ5 : 89 ms
    C) Code de Paul Thot (version PChar qui évite l'indexation) : 13 ms
    D) et mon code Asm StrUpperMNA : 20 ms ...
    par contre il y a certaines différences qui faussent un peu les comparaisons :
    Avec le code CJ1 et StrUpperMNA on n'enlève pas que les accents on passe tout en majuscules non accentuées alors qu'avec les autres codes on n'enlève que les accents et on se retrouve avec un mélange majuscules+minuscules.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #14
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Pour les voyelles accolées, je ne suis pas d'accord avec toi, mais tout dépend de ton problème de départ... si c'est juste pour rechercher une chaîne, ça peut suffire.

    Par ailleurs, il faut comparer ce qui est comparable : les insertions de caractères sont très coûteuses en temps de calcul, c'est ce qui explique les temps de calcul de "CJ4" et "CJ5". Mais je l'avais expliqué plus haut. C'est le prix à payer pour transformer les voyelles doubles en doubles voyelles...

    L'histoire de la dichotomie, ce n'est pas bien compliqué, mais il me faudrait du temps pour expliquer en détail ce que j'ai voulu dire par là, et peut-être faire une maquette en Pascal.

    Enfin, le code que tu appelles CJ3, c'est le même que celui de Paul THOT, j'ai juste ajouté la constante ! Donc, les temps sont les mêmes, en principe... Et pour répondre à ton autre remarque concernant le passage en majuscule, vu que TOTH/CJ3 ne dépend absolument pas du contenu de la constante, si on remplace les minuscules ar des majuscules, le temps reste le même :

    Donc, pour cette fonction suivante ( CJ6 ) le temps dans tes conditions de test devrait toujours être à 13/14 ms...

    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
     
    const MNA : array[Char] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' +
                    '`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Z'#143#144'‘’“”•–—˜™S›Œ'#157'ZY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO÷OUUUUYÞY';
     
    function CJ6(const AText : String) : string;
    var
     i:integer;
     p:pchar;
    begin
     Result:=AText;
     if Result='' then exit;
     p:=@Result[1];
     for i:=1 to Length(Result) do begin
      p^:=MNA[p^];
      inc(p);
     end;
    end;
    Edit : j'oubliais... le ß est évidemment le caractère allemand. Ça n'a été dit à aucun moment, mais nous traitons dans ce fil de la page ANSI occidentale. L'alphabet grec, pour sa part, dispose de sa propre page de code...

  15. #15
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Ceci devrait être rapide :
    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
    const SansAccents : array[#0..#255] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                    '`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
                    'aaaaaaæceeeeiiiidnooooo÷ouuuuyþy';
    function CJ7(AText : String) : string;
    var i:integer;
    begin
      Result:=AText;
      for i:=1 to Length(Result) do result[i]:=SansAccents[ord(Result[i])] ;
    end;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  16. #16
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Non, justement, Paul TOTH a déjà expliqué la chose, parce qu'il y a une indexation dans cette solution, une addition à chaque fois. J'ai testé : avec le PChar ça marche mieux...

  17. #17
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,
    Non, justement, Paul TOTH a déjà expliqué la chose, parce qu'il y a une indexation dans cette solution, une addition à chaque fois. J'ai testé : avec le PChar ça marche mieux...
    Tout dépend de la façon dont l'optimiseur génère le code Assembleur:
    • Avec le pointeur, on fait une instruction incrémentation d'une variable (ou d'un registre si c'est bien optimisé).
    • Avec une indexation sur l'indice de boucle, on fait juste une instruction plus complexe.
    Pour départager les codes assembleurs optimum correspondant à ces 2 méthodes, il faudrait aller jusqu'à compter le nombre de cycles (et encore avec le système d'instructions chargées en avance et partiellement précalculées ou parallélisées, on ne serait pas vraiment sur du résultat ....).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  18. #18
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    CapJack a écrit :
    Pour les voyelles accolées, je ne suis pas d'accord avec toi, mais tout dépend de ton problème de départ... si c'est juste pour rechercher une chaîne, ça peut suffire.
    ... c'est effectivement dans cet état d'esprit que je me suis placé car si je cherche par exemple le mot "eufs" rentré tel que dans un TEdit car je ne me rappelle jamais la combinaison de touches (Alt-combien?) qu'il faut faire pour rentrer au clavier le "œ" et que dans le texte de recherche il existe le mot Œufs la recherche après conversion préalable du texte ET du mot cherché aboutira à un résultat correct et ceci est également valable dans le sens inverse ("Œufs" rentré au clavier, et "eufs" dans le texte) ... d'où mon intérêt pour la conversion intégrale en Majuscules-Non-Accentuées.
    ... je ne verrais pas bien l'intérêt de convertir un texte pour y retirer uniquement les accents tout en y laissant d'autres particularités de graphisme des caractères car si j'ai bien compris Bruno13 cherche à dégager les concepts développés dans un texte plutôt que de chercher à l'imprimer avec le respect du graphisme qui s'imposerait dans ce cas.

    CapJack a écrit :
    Par ailleurs, il faut comparer ce qui est comparable : les insertions de caractères sont très coûteuses en temps de calcul, c'est ce qui explique les temps de calcul de "CJ4" et "CJ5". Mais je l'avais expliqué plus haut. C'est le prix à payer pour transformer les voyelles doubles en doubles voyelles...
    ... Exact. Mais il faudrait que Bruno13 confirme ici si oui ou non il veut sanctionner ses durées d'exécution juste pour remplacer :
    - "œ" par "oe" au lieu de "e" qui tous les trois se prononcent de la même façon
    - "æ" par "ae" au lieu de "e" ... et kif-kif pour les majuscules correspondantes.
    ... après tout c'est son cahier de charges qui décide. (Et comme de toutes façons son code initial est entre 58 et 461 fois plus lent que tous ceux qui ont été proposés il n'a que l'embarras du choix)

    CapJack a écrit :
    L'histoire de la dichotomie, ce n'est pas bien compliqué, mais il me faudrait du temps pour expliquer en détail ce que j'ai voulu dire par là, et peut-être faire une maquette en Pascal.
    ... ce serait sympa, par contre plutôt qu'une longue explication une maquette en Pascal serait tout aussi parlante.

    CapJack a écrit :
    Enfin, le code que tu appelles CJ3, c'est le même que celui de Paul THOT, j'ai juste ajouté la constante ! Donc, les temps sont les mêmes, en principe...
    ... Exact. En fait je n'avais absolument pas regardé le contenu de tous ces codes dans le détail, je les ai tous rapatriés, intégrés dans mon unité, encadrés par des chronomètres, lancé les comparaisons, et pour chaque code j'ai chaque fois recommencé plusieurs fois en retenant pour chacun la durée maximale arrondie à la milliseconde supérieure (d'un click au suivant il ya souvent des résultats qui varient d'une à 2 ms).

    CapJack a écrit :
    Et pour répondre à ton autre remarque concernant le passage en majuscule, vu que TOTH/CJ3 ne dépend absolument pas du contenu de la constante, si on remplace les minuscules ar des majuscules, le temps reste le même
    :
    ... en toute logique il doit rester le même. En fait au moment où j'ai rédigé la remarque concernant le passage en majuscules je pensais que si avec les PChar on arrivait à descendre jusqu'aux 13 ms on devrait pouvoir gratter encore quelques millisecondes en assembleur Asm en améliorant StrUpperMNA ... sauf que, mystère et boule de gomme, ce matin j'ai fait le même essai avec la fonction originale StrUpper en Asm de Borland (d'où j'ai dérivé StrUpperMNA et avec StrUpper qui ne fait rien d'autre que de passer les minuscules-non-accentuées en majuscules-non-accentuées sans remplacer les minuscules-accentuées) a mis 17 ms ... donc impossible de gratter quoi que ce soit en surchargeant StrUpper avec des tests+remplacements de caractères supplémentaires.

    CapJack a écrit :
    Donc, pour cette fonction suivante ( CJ6 ) le temps dans tes conditions de test devrait toujours être à 13/14 ms...
    ... j'ai récupéré CJ6 et ça m'étonnerait que le temps soit différent.

    CapJack a écrit :
    j'oubliais... le ß est évidemment le caractère allemand. Ça n'a été dit à aucun moment, mais nous traitons dans ce fil de la page ANSI occidentale. L'alphabet grec, pour sa part, dispose de sa propre page de code...
    ... OK. Comme je ne me souviens jamais du Alt-combien qui correspond au ß je le récupère dans la fonte "Symbol"
    A+
    P.S : J'ai également récupéré la fonction de Graffito qui reprend le principe du code n°1 de Paul Thot que je n'avais pas testé vu qu'il était dit que celle avec les PChar était plus rapide.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    Tout dépend de la façon dont l'optimiseur génère le code Assembleur:
    • Avec le pointeur, on fait une instruction incrémentation d'une variable (ou d'un registre si c'est bien optimisé).
    • Avec une indexation sur l'indice de boucle, on fait juste une instruction plus complexe.
    Pour départager les codes assembleurs optimum correspondant à ces 2 méthodes, il faudrait aller jusqu'à compter le nombre de cycles (et encore avec le système d'instructions chargées en avance et partiellement précalculées ou parallélisées, on ne serait pas vraiment sur du résultat ....).
    a mon avis la résultat dépendra aussi de la version de Delphi utilisée

    pour voir la différence il faudrait faire un grand nombre de boucle...ce qui rejoint ma remarque du début, la procédure a-t-elle besoin d'être super optimisée, est-elle utilisée de nombreuses fois ou pas ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Dans les mêmes conditions d'essais détaillés dans mon message d'Hier, 16/07, 18h49 le code CJ6 qui est la version du code n°2 de Paul Thot dont la constante a été remaniée par CapJack pour l'adapter au cas de la conversion intégrale en Majuscules-Non-Accentuées a mis 13 à 14 ms comme prévu.
    Et le code de Graffito qui équivaut au code n°1 de Paul Thot (code sans les PChar) a mis 24 ms.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Y-a-t-il plus rapide pour enlever les mots vides ?
    Par Bruno13 dans le forum Delphi
    Réponses: 33
    Dernier message: 26/07/2007, 17h03
  2. [XHTML] Moyen plus rapide pour mettre mes pages en XHTML
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 30/08/2005, 17h46
  3. Algo le plus rapide pour trouver une répétition ?
    Par AsmCode dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/07/2005, 00h26
  4. Réponses: 16
    Dernier message: 19/05/2005, 16h20
  5. [FoxPro]Instruction pour enlever les accents ?
    Par Fab-FoxPro dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 19/08/2003, 15h46

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