Почему «функциональное тело» является узким местом моего приложения? - PullRequest
0 голосов
/ 27 сентября 2018

Приложение, которое я разрабатываю, работает слишком медленно.

Я запустил диагностику производительности Visual Studio и обнаружил, что одна функция выполнялась в 66% случаев, функция GetHashCodeследующий класс.

Public Class Identifier

    Public Property Name As String

    Public Overrides Function GetHashCode() As Integer
        Return Name.ToUpper().GetHashCode()
    End Function

    Public Overrides Function Equals(other As Object) As Boolean
        Dim otherIdentifier = TryCast(other, Identifier)
        If otherIdentifier Is Nothing Then
            Return False
        Else
            Return String.Equals(Name, otherIdentifier.Name, StringComparison.InvariantCultureIgnoreCase)
        End If
    End Function
End Class

Что меня еще больше удивляет, так это то, что на панели «Вызываемые функции» я читаю в терминах прошедшего времени включения:

  • System.String.ToUpper (): 0,61%
  • System.String.GetHashCode (): 0,21%
  • Тело функции: 66,67%

Поскольку функция не выполняет ничего, кромевызовите функции ToUpper и GetHashCode, мне трудно понять, что я могу улучшить здесь.

Не могли бы вы помочь мне пролить свет на это?

1 Ответ

0 голосов
/ 27 сентября 2018

Я не очень знаком с диагностикой производительности VS.Но здесь - это нечто упомянутое о Функциональном теле .

Function Body также показывает общее количество времени (и процент времени), проведенного в теле функции, исключая время, потраченное на вызов и вызванные функции

Нов действительности это не объясняет, почему 2/3 времени тратится на GetHashCode, когда исключены звонки на номера ToUpper и GetHashCode.

Однако ..

"Высокие значения в теле функции могут указывать на узкое место производительности в самой функции"

Это очевидно, ToUpper всегдадолжен создать новую строку для каждой строки, которую он должен сравнить.Если вы делаете это миллионы раз, у вас высокое давление памяти, и GC срабатывает. Вот почему я бы использовал StringComparer:

Public Overrides Function GetHashCode() As Integer
    Return StringComparer.InvariantCultureIgnoreCase.GetHashCode(Name)
End Function

Вы можете использовать его также в Equals

Public Overrides Function Equals(other As Object) As Boolean
   Dim otherIdentifier = TryCast(other, Identifier)
   If otherIdentifier Is Nothing Then Return False
   Return StringComparer.InvariantCultureIgnoreCase.Equals(Name, otherIdentifier.Name)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...