我需要验证我的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
答案 0 :(得分:2)
第一条评论 - 当您在第一个区块中声明allUser
时,摆脱无意义的实例化 - 更改
Dim alluser As New MembershipUserCollection()
到
Dim alluser As MembershipUserCollection
如果不了解用户中的成员资格提供者以及方法的实现,就无法回答其余部分。你试过计时吗?
答案 1 :(得分:1)
哪个功能在可读性方面更好:
我不太清楚视觉基础,但在第二个函数中,是否有办法检查themember
是否直接看空它,而不是必须循环它?某种方法名称如“IsEmpty”。
假设存在,您可以将第二个示例中的代码更改为仅2行:
Dim themember As MembershipUserCollection = Membership.FindUsersByName(arg, 0, 1, 1)
' Check if themember is empty, return true or false appropriately
在这种情况下,第二个功能会更容易阅读。
哪种功能在效率方面更好:
在不知道FindUsersByName
或GetAllUsers
的详细信息的情况下甚至无法猜测,但我猜第二个函数更快(因为它将工作卸载到为其设计的特定函数)。 / p>
然而,这是一个非常粗略的猜测。回答这个问题的唯一正确方法是实现两个并在两者上运行测试,以找出哪个更快。
无论如何,这种差异不太可能是重要的,但如果你真的在意,你肯定要为每个解决方案留出时间。
答案 2 :(得分: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)
答案 3 :(得分: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
按名称检索单个用户。毕竟,我不建议实现允许多个同名用户的成员资格提供程序。
答案 4 :(得分:0)
我会使用第二个功能进行一些修改。
不要使用FindUsersByName
,请尝试GetUser
- 当您正在寻找一位用户时,这更为正确。
然后,检查用户的count属性。
Dim user = Membership.GetUser(arg)
If user = 1 Then
Return True;
Else
Return False;
End If
我真的不懂Visual Basic,但我确信if语句可以更简单,比如return (user === 1) ? true : false
在其他语言中。
答案 5 :(得分:-1)
在您拥有成千上万的应用程序用户之前,这些功能的性能不会产生显着差异。
我的建议是停止微观优化,除非你通过剖析将其识别为问题区域。