Является DateTime.ParseExact() быстрее, чем DateTime.Parse()

Я хотел бы знать, быстрее ли ParseExact, чем Parse.

Я думаю, что это должен быть ParseExact, поскольку вы уже дали формат, но я также думаю, что вся проверка информации о культуре замедлит ее. Говорит ли Microsoft в любом документе о разнице в производительности между этими двумя. Формат, который будет использоваться, представляет собой общий формат "yyyy/MM/dd".

Например:

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

Ответ 1

Вы просите разницу в скорости для двух методов, которые функционально отличаются (близкие, но все еще разные).

Просто выберите тот, который наиболее подходит.

И нет, производительность библиотечных методов почти никогда не документирована.

Но я могу рассказать вам кое-что об этой разнице:

  • он маленький,
  • он может измениться в будущих версиях

Ответ 2

Если вы укажете только один формат для TryParseExact, это все, что он попробует. Parse пробует все форматы либо до тех пор, пока не будет найдено наилучшее совпадение или не будет найдено первое совпадение. (Я не уверен, что.) Я сделал это несколько недель назад, с настраиваемой CultureInfo. Я не тестировал производительность, но я выполнял модульные тесты по моим методам анализа (без настройки CultureInfo, см. Ниже) против 61 880 дат, хранящихся в базе данных. Я не заметил никаких проблем с производительностью.

Независимо от того, если вы указали 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