DateTime.ParseExact()比DateTime.Parse()更快吗?

Nap*_*Nap 10 c# datetime

我想知道ParseExact是否比Parse更快.

我认为它应该是ParseExact,因为你已经给出了格式,但我也认为对文化信息的所有检查都会降低它的速度.微软是否在任何文件中都说两者之间的性能差异.要使用的格式是通用的"yyyy/MM/dd"格式.

例如:

DateTime.Parse(DateText);
DateTime.ParseExact(DateText, "yyyy/MM/dd", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 16

您要求两种功能不同的方法(接近但仍然不同)的速度差异.

只需挑选一个最合适的.

不,几乎从未记录过库方法的性能.

但我可以告诉你一些关于这种差异的事情:

  • 它很小,
  • 在未来的版本中它可能会改变

  • @AMissico是的,这正是他们在功能上不同的原因. (3认同)

AMi*_*ico 5

如果你只指定一种格式,TryParseExact它会尝试。Parse尝试所有格式,直到找到最佳匹配或找到第一个匹配。(我不确定是哪个。)几周前我用自定义的 CultureInfo 做了这个。我没有测试性能,但我确实针对存储在数据库中的 61,880 个日期对我的解析方法(没有自定义的 CultureInfo,见下文)运行了单元测试。我没有注意到任何性能问题。

无论您是否指定 CultureInfo,如果没有传递,内部解析例程将使用 CultureInvariant。因此,CultureInfo 不会减慢该过程。(由于需要额外解析,希伯来语和其他“异国情调”日期存在一些性能下降。)根据我对 DateTime 源代码的审查,字符串格式的数量决定了这些例程解析日期字符串的速度。格式越多,速度越慢。如果您只指定一个,那么解析的速度与...Exact方法一样快。


Imports System.Globalization

Public Class ExifDateTime

    Private Shared _formats() As String = New String() { _
        "yyyy:MM:dd", _
        "yyyy:MM:dd HH:mm:ss", _
        "yyyy:MM:dd HH:mm:ss.f", _
        "yyyy:MM:dd HH:mm:ss.ff", _
        "yyyy:MM:dd HH:mm:ss.fff", _
        "yyyy:MM:dd HH:mm:ss.fffK", _
        "yyyy:MM:dd HH:mm:ss.ffffffK", _
        "yyyy:MM:dd HH:mm:ssK", _
        ""}


    Public Shared Function Parse(ByVal s As String) As Date
        Dim oResult As Date
        If TryParse(s, DateTimeStyles.None, oResult) = False Then
            Throw New FormatException
        End If
        Return oResult
    End Function

    Public Shared Function Parse(ByVal s As String, ByVal style As System.Globalization.DateTimeStyles) As Date
        Dim oResult As Date
        If TryParse(s, style, oResult) = False Then
            Throw New FormatException
        End If
        Return oResult
    End Function

    Public Shared Function TryParse(ByVal s As String, ByRef result As Date) As Boolean
        Return TryParse(s, DateTimeStyles.None, result)
    End Function

    Public Shared Function TryParse(ByVal s As String, ByVal style As System.Globalization.DateTimeStyles, ByRef result As Date) As Boolean
        Dim fResult As Boolean
        Dim oResultant As Date

        fResult = Date.TryParseExact(s, _formats, CultureInfo.InvariantCulture, style, oResultant)

        If fResult Then
            result = oResultant
        End If

        Return fResult

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)