DateTime.ParseExact () быстрее, чем DateTime.Parse () - PullRequest
10 голосов
/ 24 марта 2010

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

Я думаю, что это должен быть ParseExact, поскольку вы уже указали формат, но я также думаю, что вся проверка информации о культуре замедлит его. Говорит ли Microsoft в любом документе о разнице в производительности между ними. Используемый формат - это общий формат «гггг / мм / дд».

Например:

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

Ответы [ 2 ]

15 голосов
/ 24 марта 2010

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

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

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

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

  • мал,
  • это может измениться в будущих версиях
4 голосов
/ 24 марта 2010

Если вы укажете только один формат для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...