我正在开发的应用程序运行速度太慢。
我已经运行了Visual Studio的性能诊断程序,发现下一个类的GetHashCode
函数有66%的时间在运行一个函数。
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
令我更加困扰的是,我在“被调用的功能”面板中看到了“经过的包容时间”:
由于该函数除了调用ToUpper
和GetHashCode
函数外什么也不做,因此我很难在这里找出可以改进的地方。
您能帮我阐明一下吗?
答案 0 :(得分:5)
我对VS性能诊断不是很熟悉。但是here是有关功能主体的内容。
Function Body
还会显示您的总时间(以及 在功能主体中花费的时间百分比(不包括在 调用和被调用函数
但是,这并没有真正解释为什么在排除GetHashCode
和ToUpper
的调用的情况下,在GetHashCode
中花费了2/3的时间。
但是..
“功能主体中的高值可能表示性能瓶颈 在函数本身中”
很明显,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