哪种功能更快更有效?

时间:2010-01-05 08:33:20

标签: asp.net vb.net function

我需要验证我的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

6 个答案:

答案 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

在这种情况下,第二个功能会更容易阅读。

哪种功能在效率方面更好:

在不知道FindUsersByNameGetAllUsers的详细信息的情况下甚至无法猜测,但我猜第二个函数更快(因为它将工作卸载到为其设计的特定函数)。 / 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)

在您拥有成千上万的应用程序用户之前,这些功能的性能不会产生显着差异。
我的建议是停止微观优化,除非你通过剖析将其识别为问题区域。