gpt4 book ai didi

.net - 为什么 'Function Body' 成为我的应用程序的瓶颈?

转载 作者:行者123 更新时间:2023-12-04 12:16:14 26 4
gpt4 key购买 nike

我正在开发的应用程序运行速度太慢。

我运行了 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%

  • 由于该函数什么都不做,只是调用 ToUpperGetHashCode功能,我很难弄清楚我可以在这里改进什么。

    你能帮我解释一下吗?

    最佳答案

    我对 VS 性能诊断不是很熟悉。但是here是关于函数体的东西。

    Function Body also shows you the total amount of time (and the percentage of time) spent in the function body excluding time spent in calling and called functions



    但这并不能真正解释为什么 2/3 的时间花在 GetHashCode 上。当调用 ToUpperGetHashCode被排除在外。

    然而..

    "High values in Function Body may indicate a performance bottleneck within the function itself"



    这很明显, 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

    关于.net - 为什么 'Function Body' 成为我的应用程序的瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52532635/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com