views:

101

answers:

6

I need to verify if a certain user exist on my asp.net site.I want to know if which of these two functions is more efficient, faster and better compared to each other and why.Thanks in advance!


 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

or



  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
+2  A: 

First comment - get rid of the pointless instantiation when you declare allUser in your first block - change

Dim alluser As New MembershipUserCollection()

to

Dim alluser As MembershipUserCollection

It's impossible to answer the rest without knowing about the membership provider in user and the implementation of the method. Have you tried just timing it?

David M
A: 

The performance of these functions are not going to make a noticeable difference until you have hundreds of thousands of users for the application.
My suggestion is to stop micro-optimizing unless you have identified this as a problem area through profiling.

NimsDotNet
Making such a performance claim is premature without knowing which membership provider is used.
Thorarin
If your membership provider does not provide that level of optimization you are doomed anyway! :)
NimsDotNet
+1  A: 

Which function is better in terms of readability:

I don't remember visual basic too well, but in the second function, isn't there a way to check themember to see whether it's empty directly, instead of having to loop through it? Some kind of method name like "IsEmpty".

Assuming that there is, you can change the code in the second example to just 2 lines:

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

In that case, the second function will be much better in the sense that it's easier to read.

Which function is better in terms of efficiency:

It's impossible to even guess without knowing the details of FindUsersByName or GetAllUsers, but I would guess the second function is faster (since it offloads the work to a specific function designed for it).

However, this is a very crude guess. The only proper way to answer this question is to implement the two and run tests on both, to find out which is faster.

In any case, the difference is unlikely to be enough to matter, but if you really care, you definitely have to time each solution.

Edan Maor
+1  A: 

Usually the easiest way to answer questions of this type ("which is faster"), is to simply measure it.

.NET har a built-in class for this purpose, 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)
Jørn Schou-Rode
A: 

I would go with the second function with a few modifications.

Instead of using FindUsersByName, try GetUser -- this is more correct as you are looking for one user.

Then, check the count property of the user.

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

I don't really know Visual Basic, but I'm sure that if statement could be simpler, something like return (user === 1) ? true : false in other languages.

Carson Myers
`Membership` is a standard class in `System.Web.Security`.
Thorarin
Alright, thank you, I'll try and make my answer more useful knowing that
Carson Myers
http://en.wikipedia.org/wiki/%3F:#Visual_Basic_.NET
Daniel May
that syntax is just silly!
Carson Myers
+1  A: 

Generally speaking, the second option has the better potential for performance. The actual effect depends on which membership provider you are using, but in the second case any implementation can take advantage of any internal indexing mechanisms if they are present, and potentially less data needs to be retrieved and transferred because you're only getting at most one MembershipUser due to the paging.

Theoretically, the first option could be faster than the second, but that would mean the membership provider implementation really sucks :)

You appear to be counting the number of members in the collection, but you merely need to know if there is at least one member in the collection. Thus counting is not actually necessary. Also, what is wrong with using the Count property? I'm not saying this for optimization purposes since the impact will be minimal, but I think the intent of your code would be clearer if written that way.

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

Alternatively, use Membership.GetUser to retrieve a single user by name. After all, I wouldn't recommend implementing a membership provider that allows for multiple users with the same name.

Thorarin