2010-01-05 6 views
1

Je dois vérifier si un certain utilisateur existe sur mon site asp.net. Je veux savoir si, parmi ces deux fonctions, laquelle est la plus efficace, la plus rapide et la meilleure par rapport à l'autre et pourquoi? Merci d'avance!Quelle est la fonction la plus rapide et la plus efficace?


Public Function CheckIfFriendExist(ByVal arg As String) As Boolean 
     Dim alluser As New MembershipUserCollection() 
     alluser = Membership.GetAllUsers() 
     For Each user As MembershipUser In alluser 
      If user.UserName.ToLower() = arg.ToLower() Then 
       Return True 
       Exit For 
      End If 
     Next 
     Return False 
    End Function 

ou



    Public Function CheckIFFriendExist2(ByVal arg As String) As Boolean 
     Dim x As Integer = 0 
     Dim themember As MembershipUserCollection = Membership.FindUsersByName(arg, 0, 1, 1) 
     For Each member As MembershipUser In themember 
      x = x + 1 
     Next 
     If x > 0 Then 
      Return True 
     Else 
      Return False 
     End If 

    End Function 

Répondre

1

En règle générale, la deuxième option a le meilleur potentiel pour les performances. L'effet réel dépend du fournisseur d'appartenance que vous utilisez, mais dans le second cas, toute implémentation peut tirer parti des mécanismes d'indexation internes s'ils sont présents, et potentiellement moins de données doivent être récupérées et transférées parce que vous n'en obtenez que le maximum. un MembershipUser en raison de la pagination.

En théorie, la première option pourrait être plus rapide que le second, mais cela signifierait la mise en œuvre du fournisseur d'appartenances est vraiment nul :)

Vous semblez compter le nombre de membres de la collection, mais vous simplement besoin de savoir s'il y a au moins un membre dans la collection. Le comptage n'est donc pas réellement nécessaire. En outre, quel est le problème avec l'utilisation de la propriété Count? Je ne dis pas cela à des fins d'optimisation, car l'impact sera minime, mais je pense que l'intention de votre code serait plus claire s'il était écrit de cette façon.

Public Function CheckIFFriendExist2(ByVal arg As String) As Boolean 
    Dim foundMembers As MembershipUserCollection = _ 
     Membership.FindUsersByName(arg, 0, 1, 1) 

    Return foundMembers.Count > 0 
End Function 

Vous pouvez également utiliser Membership.GetUser pour récupérer un seul utilisateur par son nom. Après tout, je ne recommanderais pas d'implémenter un fournisseur d'appartenances qui permette plusieurs utilisateurs avec le même nom.

2

commentaire d'abord - se débarrasser de l'instanciation inutile lorsque vous déclarez allUser dans votre premier bloc - changer

Dim alluser As New MembershipUserCollection() 

à

Dim alluser As MembershipUserCollection 

Il est imposer sible de répondre au reste sans connaître le fournisseur d'appartenance à l'utilisateur et la mise en œuvre de la méthode. Avez-vous essayé de le chronométrer?

-1

Les performances de ces fonctions ne vont pas faire une différence notable jusqu'à ce que vous ayez des centaines de milliers d'utilisateurs pour l'application.
Ma suggestion est d'arrêter la micro-optimisation, sauf si vous avez identifié cela comme un problème à travers le profilage.

+1

Faire une telle réclamation de performance est prématuré sans savoir quel fournisseur d'appartenance est utilisé. – Thorarin

+0

Si votre fournisseur d'adhésion ne fournit pas ce niveau d'optimisation, vous êtes condamné de toute façon! :) –

1

Quelle fonction est meilleure en termes de lisibilité:

Je ne me souviens pas trop de Visual Basic, mais dans la seconde fonction, n'est pas là un moyen de vérifier themember pour voir si elle est vide directement , au lieu d'avoir à faire une boucle? Une sorte de nom de méthode comme "IsEmpty".

Si l'on suppose qu'il ya, vous pouvez modifier le code dans le second exemple à seulement 2 lignes:

Dim themember As MembershipUserCollection = Membership.FindUsersByName(arg, 0, 1, 1) 
' Check if themember is empty, return true or false appropriately 

Dans ce cas, la deuxième fonction sera beaucoup mieux dans le sens où il est plus facile à lire.

Quelle fonction est meilleure en termes d'efficacité:

Il est impossible de deviner même sans connaître les détails de FindUsersByName ou GetAllUsers, mais je suppose que la deuxième fonction est plus rapide (car il déleste le travail à un fonction spécifique conçue pour cela).

Cependant, est une estimation très grossière. La seule bonne façon de répondre à cette question est de mettre en œuvre les deux et de lancer des tests sur les deux, pour savoir lequel est le plus rapide.

Dans tous les cas, il est peu probable que la différence soit importante, mais si vous y tenez vraiment, vous devez absolument choisir chaque solution.

1

Habituellement, la façon la plus simple de répondre à des questions de ce type («qui est plus rapide») consiste simplement à la mesurer.

har .NET une classe intégrée à cet effet, System.Diagnostics.Stopwatch:

Dim stopwatch As New System.Diagnostics.Stopwatch 
stopwatch.Start() 
For i = 0 To 10000 
    MethodThatMightJustTakeTooLong() 
Next i 
stopwatch.Stop() 
Console.Writeline(Elapsed) 
0

j'irais avec la deuxième fonction avec quelques modifications.Au lieu d'utiliser FindUsersByName, essayez GetUser au lieu de FindUsersByName - c'est plus correct que vous recherchez un utilisateur.

Ensuite, vérifiez la propriété count de l'utilisateur.

Dim user = Membership.GetUser(arg) 
If user = 1 Then 
    Return True; 
Else 
    Return False; 
End If 

Je ne sais pas vraiment Visual Basic, mais je suis sûr que si la déclaration pourrait être plus simple, quelque chose comme return (user === 1) ? true : false dans d'autres langues.

+0

'Membership' est une classe standard dans' System.Web.Security'. – Thorarin

+0

Très bien, merci, je vais essayer de rendre ma réponse plus utile sachant que –

+0

http://en.wikipedia.org/wiki/%3F:#Visual_Basic_.NET –

Questions connexes