Какая функция быстрее и эффективнее? - PullRequest
1 голос
/ 05 января 2010

Мне нужно проверить, существует ли определенный пользователь на моем сайте 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 ]

2 голосов
/ 05 января 2010

Первый комментарий - избавьтесь от бессмысленной реализации, когда вы объявляете allUser в своем первом блоке - измените

Dim alluser As New MembershipUserCollection()

до

Dim alluser As MembershipUserCollection

Невозможно ответить на все остальное, не зная о членстве поставщика в пользователе и реализации метода. Вы пробовали просто рассчитать время?

1 голос
/ 05 января 2010

Вообще говоря, второй вариант имеет лучший потенциал для производительности. Фактический эффект зависит от того, какого поставщика членства вы используете, но во втором случае любая реализация может воспользоваться любыми внутренними механизмами индексации, если они присутствуют, и потенциально меньше данных необходимо извлекать и передавать, потому что вы получаете только максимум один 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, чтобы получить одного пользователя по имени. В конце концов, я бы не рекомендовал реализовывать поставщика членства, который бы позволял нескольким пользователям с одинаковым именем.

1 голос
/ 05 января 2010

Обычно самый простой способ ответить на вопросы такого типа («который быстрее») - это просто измерить его.

.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)
1 голос
/ 05 января 2010

Какая функция лучше с точки зрения читабельности:

Я не слишком хорошо помню 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

В этом случае вторая функция будет намного лучше в том смысле, что ее легче читать.

Какая функция лучше с точки зрения эффективности:

Невозможно даже угадать, не зная подробностей FindUsersByName или GetAllUsers, но я бы предположил, что вторая функция работает быстрее (поскольку она переносит работу на определенную функцию, предназначенную для нее).

Однако это очень грубое предположение . Единственный правильный способ ответить на этот вопрос - реализовать два и запустить тесты на обоих, чтобы выяснить, что быстрее.

В любом случае, разница вряд ли будет существенной, но если вам действительно все равно, вам обязательно нужно рассчитать время каждого решения.

0 голосов
/ 05 января 2010

Я бы пошел со второй функцией с несколькими модификациями.

Вместо использования FindUsersByName, попробуйте GetUser - это более правильно, так как вы ищете одного пользователя.

Затем проверьте свойство count пользователя.

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

Я действительно не знаю Visual Basic, но я уверен, что если оператор может быть проще, что-то вроде return (user === 1) ? true : false в других языках.

0 голосов
/ 05 января 2010

Производительность этих функций не изменится, пока у вас не появятся сотни тысяч пользователей для приложения.
Я предлагаю прекратить микрооптимизацию, если вы не определили это как проблемную область при профилировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...