Является 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