2010-01-05 327 views
1

我需要驗證某個用戶是否存在於我的asp.net站點上。我想知道這兩個函數中的哪一個比其他哪個函數更高效,更快,更好,並且相互之間爲什麼。提前感謝!哪種功能更快更高效?


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 



    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 

回答

1

一般來說,第二個選項具有更好的潛力的性能。實際效果取決於您使用哪個成員資格提供程序,但在第二種情況下,任何實現都可以利用任何內部索引機制(如果它們存在),並且可能需要檢索和傳輸的數據可能更少,因爲您只能獲取最多由於尋呼導致一個MembershipUser

從理論上講,第一個選項可能比第二快,但是這將意味着會員提供者實現實在太爛:)

你似乎是計數集合中成員的數量,但你只是需要知道集合中是否至少有一個成員。因此計數實際上不是必需的。另外,使用Count屬性有什麼問題?我不是說這是爲了優化的目的,因爲影響會很小,但是我認爲如果以這種方式編寫,代碼的意圖會更清晰。

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 

或者,使用Membership.GetUser按名稱檢索單個用戶。畢竟,我不建議實施一個允許同名多個用戶的會員提供商。

2

首評 - 擺脫當你在你的第一個代碼塊中聲明allUser無謂的實例化 - 改變

Dim alluser As New MembershipUserCollection() 

Dim alluser As MembershipUserCollection 

這是impos在不知道用戶的成員資格提供者和該方法的實現的情況下回答剩下的問題。你有沒有試過,只是時機?

-1

這些功能的性能不會產生顯着的差異,直到您擁有數十萬個應用程序的用戶。
我的建議是停止微觀優化,除非您已通過分析將其識別爲問題區域。

+1

在不知道使用哪個成員資格提供者的情況下提出此類表現聲明爲時過早。 – Thorarin 2010-01-05 08:45:51

+0

如果您的會員供應商沒有提供該級別的優化,您註定會失敗! :) – 2010-01-05 10:26:06

1

哪個函數是在可讀性方面更好:

我不記得的Visual Basic太清楚,但在第二個功能,是不是有檢查themember,看它是否直接是空的方式,而不是必須通過它循環?某種方法名稱,如「IsEmpty」。

假設有,你可以改變在第二個例子只是2行代碼:

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

在這種情況下,第二個功能是在這個意義上,它更容易閱讀好得多。

哪個函數是在效率方面更好:

這是不可能不知道的FindUsersByNameGetAllUsers細節甚至猜測,但我猜的第二個功能是更快的(因爲它卸載工作到爲其設計的特定功能)。

但是,這是一個非常粗略的猜測。回答這個問題的唯一正確方法是實施兩者並在兩者上運行測試,以找出哪一個更快。

無論如何,這種差異不太可能足以說明問題,但如果你真的在乎,那你絕對得花每個解決方案的時間。

1

通常,回答這種類型問題(「哪個更快」)最簡單的方法就是簡單地測量它。

.NET哈日內置類爲此,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

我會去與一些修改的第二功能。

而不是使用FindUsersByName,嘗試GetUser - 這是更正確的,因爲你正在尋找一個用戶。

然後,檢查用戶的計數屬性。

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

我真的不知道的Visual Basic,但我敢肯定,如果聲明可能很簡單,在其他語言類似return (user === 1) ? true : false

+0

'成員資格'是'System.Web.Security'中的標準類。 – Thorarin 2010-01-05 08:54:14

+0

好吧,謝謝,我會盡量讓我的回答更有用,因爲知道 – 2010-01-05 08:59:10

+0

http://en.wikipedia.org/wiki/%3F:#Visual_Basic_.NET – 2010-01-05 09:25:09