2009-01-06 5 views
2

Dans VB6, on m'a dit que lors des tests pour une chaîne vide, il serait beaucoup plus rapide de vérifier en vérifiant la longueur de la chaîne en utilisant:VB.NET- Peformance lors du test d'une chaîne vide

If Len("ABC") = 0 then 'fast 

ou

If LenB("ABC") = 0 then 'even faster 

au lieu de:

If "ABC" = "" then 'slower 

Connaissez-vous par hasard si cela est vrai aussi dans VB.NET? Merci.

Répondre

9

Je ne pas exactement la syntaxe pour VB mais en C# vous pouvez utiliser la méthode statique String IsNullOrEmpty:

String.IsNullOrEmpty("ABC") 

Lorsque vous déboguez cette méthode, il vérifiera la longueur du paramètre. La vérification de la longueur est toujours plus rapide car sur String compare, le compilateur doit créer un nouvel objet à comparer (dans ce cas une chaîne "ABC").

+0

Voulez-vous dire que le IsNullOrEmpty est plus rapide que .length? –

+1

Non. Si vous déboguez cette fonction, vous verrez que .NET Framework utilise .length au lieu de comparer avec une chaîne vide. – robertpnl

+2

Il n'est pas vraiment important de savoir s'il utilise la longueur: MS peut modifier cette implémentation dans un correctif futur. Ce qui est plus important, c'est que c'est la bonne façon de faire le test. Il pourrait être un peu plus lent de temps en temps, mais je doute sérieusement que les chèques de chaînes vides soient un goulot d'étranglement dans votre application. –

1

Vous devez utiliser:

If ("Value").Length > 0 Then 

End If 
6

Ce n'est pas nécessaire non, je veux dire que vous plaisantez? Combien de personnes écrivent des programmes où comparer une chaîne pour voir si elle est de longueur nulle a un impact sur la performance. Même si les chaînes ne conservent pas un nombre de longueurs et que VB a fait une comparaison de chaînes strcmp() c-style à chaque fois, cela ne prend pas une fonction de comparaison de chaînes très longue pour que l'une des chaînes soit zéro longueur? Mais les chaînes .NET incluent un champ de longueur et ainsi quand vous faites une comparaison de chaînes, la première chose à vérifier est si les longueurs diffèrent, c'est-à-dire une comparaison int. Tout ce que vous économisez en faisant cela vous-même si un appel de fonction, puis seulement si le JIT inline Len(). Par ailleurs, dans VB.NET, vous n'avez pas besoin d'appeler String.IsNullOrEmpty() car les comparaisons entre chaînes sont transformées en un appel à String.strcmp() qui transforme les valeurs null (Nothing en VB) en références à String.EmptyString. Il continue ensuite à appeler une fonction native que Reflector ne peut pas examiner, mais je serais à peu près sûr que la première chose à faire est de vérifier si les longueurs des chaînes diffèrent.

+0

Je suis avec vous. Ces types d'optimisations prématurées sont stupides. Je ne voudrais même pas envisager de faire quelque chose comme ça à moins que vous ne soyez dans une application extrêmement critique qui exécute une vérification de chaîne vide des millions de fois. Même alors, c'est discutable. – JohnFx

0

Je pense que la la meilleure solution pour un équivalent VB6 à IsNullOrEmpty est

Public Function IsNullOrEmpty(ByRef s As Variant) As Boolean 

    If IsNull(s) Then ' IsNull returns true if s is a Variant that is Null 
    IsNullOrEmpty = True ' IsNull returns false if s is a Variant and s = vbEmpty 
    Exit Function 
    End If 

    If LenB(s) = 0 Then ' never compare a string to "" - it's slow 
    IsNullOrEmpty = True 
    Exit Function 
    End If 

    If LenB(Trim(s)) = 0 Then 
    IsNullOrEmpty = True 
    Exit Function 
    End If 

    IsNullOrEmpty = False 

End Function 

Ironie du sort, si vous avez des chaînes ou des variantes qui sont définies à vbEmpty, cette fonction retourne false, car vbEmpty sous forme de chaîne est "0". Donc, si vous ne faites pas attention en utilisant cette version, vous pourriez avoir des erreurs étranges.

Questions connexes