Est Une Chaîne.Contient() plus rapidement que la Chaîne.IndexOf()?

J'ai un tampon de chaîne d'environ 2000 caractères et j'ai besoin de vérifier le tampon s'il contient une chaîne spécifique.
Va faire le chèque dans un ASP.NET 2.0 webapp pour chaque webrequest.

Est-ce que quelqu'un sait si la chaîne .Contient méthode fonctionne mieux que chaîne.Méthode IndexOf ?

    // 2000 characters in s1, search token in s2
    string s1 = "Many characters. The quick brown fox jumps over the lazy dog"; 
    string s2 = "fox";
    bool b;
    b = s1.Contains(s2);
    int i;
    i = s1.IndexOf(s2);

Fait Amusant

100
demandé sur Kb. 0000-00-00 00:00:00

4 réponses

Contains appels IndexOf:

public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

Qui appelle CompareInfo.IndexOf, qui utilise finalement une implémentation CLR.

Si vous voulez voir comment les chaînes sont comparées dans le CLR vous pouvez (voir CaseInsensitiveCompHelper).

IndexOf(string) n'a pas d'options et de Contains()utilise un Ordinal comparer (un octet par octet de comparaison plutôt que d'essayer d'effectuer une comparaison intelligente, par exemple, e, é).

, Donc IndexOf sera légèrement plus rapide (en théorie) IndexOf va tout droit pour une recherche de chaîne en utilisant FindNLSString de kernel32.dll (la puissance du réflecteur!).

Mise à jour pour. NET 4.0 - IndexOf n'utilise plus la comparaison ordinale et contient donc peut être plus rapide. Voir le commentaire ci-dessous.

147
répondu Chris S 2016-03-13 07:31:05

Probablement, cela n'aura pas d'importance du tout. Lisez ce post sur coding Horror ;): http://www.codinghorror.com/blog/archives/001218.html

20
répondu Gonzalo Quero 2009-01-31 11:47:24

Contains (s2) est plusieurs fois (dans mon ordinateur 10 fois) plus rapide que IndexOf(S2) car Contains utilise StringComparison.Ordinal qui est plus rapide que la recherche sensible à la culture que IndexOf fait par défaut (mais cela peut changer dans. NET 4.0 http://davesbox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx).

Contains a exactement les mêmes performances que IndexOf (S2, StringComparison.Ordinal) > = 0 dans mes tests mais c'est plus court et rend votre intention claire.

11
répondu ggf31416 2009-01-31 14:36:29

Je cours un cas réel (en face d'un benchmark synthétique)

 if("=,<=,=>,<>,<,>,!=,==,".IndexOf(tmps)>=0) {

Contre

 if("=,<=,=>,<>,<,>,!=,==,".Contains(tmps)) {

C'est une partie vitale de mon système et il est exécuté 131 953 fois (merci DotTrace).

Cependant surprise choquante , le résultat est le contraire de celui attendu

  • index de 533ms.
  • contient 266ms.

:-/

NET framework 4.0 (mis à jour comme pour 13-02-2012)

7
répondu magallanes 2012-03-13 22:25:08