Project

General

Profile

Évolution #1393

Optimisation de la méthode RemoveDiacritics

Added by Skalp almost 9 years ago. Updated over 8 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
Category:
Fonctionnalités
Target version:
Start date:
08/17/2011
Due date:
% Done:

0%

Estimated time:
1.00 h
Spent time:

Description

J'ai trouvé une légère optimisation (environ 15% plus rapide) de la méthode RemoveDiacritics sur le blog de Michael Kaplan :
http://blogs.msdn.com/b/michkap/archive/2007/05/14/2629747.aspx

A intégrer :

static string RemoveDiacritics(string stIn)
{
    string stFormD = stIn.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for (int ich = 0; ich < stFormD.Length; ich++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            sb.Append(stFormD[ich]);
        }
    }

    return (sb.ToString().Normalize(NormalizationForm.FormC));
}

History

#1 Updated by tomlev almost 9 years ago

En faisant le test, c'est effectivement plus rapide... mais de beaucoup plus que 15% ! En appliquant la méthode à un dictionnaire de 200000 mots, la nouvelle version est 5 à 10 fois plus rapide. Je pense que c'est lié à l'overhead des opérateurs Linq. Je vais voir si y a pas moyen de faire encore mieux que ça...

#2 Updated by Skalp almost 9 years ago

tomlev a écrit :

Je vais voir si y a pas moyen de faire encore mieux que ça...

Je n'en attendais pas moins de toi ^^

#3 Updated by tomlev almost 9 years ago

Bon, je pensais gagner un peu en éliminant le StringBuilder mais en fait je trouve pas de différence mesurable... en tous cas je confirme que c'était bien le .Where(...).ToArray() qui pénalisait les perfs. Je commit les modifs dans 5 minutes

#4 Updated by tomlev almost 9 years ago

En fait mon test initial était foireux, j'avais zappé le JIT. En moyenne et en excluant le premier run, la nouvelle version est "seulement" 2.5 fois plus rapide que l'ancienne (ce qui est déjà pas mal)

#5 Updated by tomlev almost 9 years ago

  • Status changed from Nouveau to Assigné
  • Assignee set to tomlev

#6 Updated by tomlev almost 9 years ago

  • Status changed from Assigné to Résolu

#7 Updated by tomlev almost 9 years ago

  • Target version set to 0.5 beta

#8 Updated by tomlev over 8 years ago

  • Status changed from Résolu to Fermé

Also available in: Atom PDF