【问题标题】:Is DateTime.ParseExact() faster than DateTime.Parse()DateTime.ParseExact() 是否比 DateTime.Parse() 快
【发布时间】:2010-03-24 09:19:18
【问题描述】:

我想知道 ParseExact 是否比 Parse 快。

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

例如:

DateTime.Parse(DateText);
DateTime.ParseExact(DateText, "yyyy/MM/dd", CultureInfo.InvariantCulture);

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

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

    只选择最合适的。

    不,库方法的性能几乎没有记录。

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

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

    【讨论】:

    • 我不确定它们在功能上是否不同。我检查了这两种方法的代码,并且在内部它们使用相同的程序。我能找到的唯一区别是 ParseExact 使用您指定的格式,而不是 CultureInfo 的所有格式。
    • @AMissico 是的,这正是它们在功能上不同的原因。
    • @Sander:嗯,我明白你的意思了。对我来说,我从功能上理解为事物运作方式的改变。在这种情况下,唯一的区别是传递给方法的参数。在内部,它的工作方式相同。
    【解决方案2】:

    如果您只为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2016-07-14
      • 2023-03-25
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多