Я хотел бы знать, быстрее ли ParseExact, чем Синтаксический анализ.
Я думаю, что это должен быть ParseExact, так как Вы уже дали формат, но я также думаю, что вся проверка информацию о Культуре замедлила бы его. Делает Microsoft, говорят в любом документе о различии в производительности между двумя. Формат, который будет использоваться, является универсальным 'yyyy/MM/dd' форматом.
Например:
DateTime.Parse(DateText);
DateTime.ParseExact(DateText, "yyyy/MM/dd", CultureInfo.InvariantCulture);
Вы спрашиваете о разнице в скорости для двух методов, которые функционально различаются (близки, но все же разные).
Просто выберите наиболее подходящий.
И нет, производительность библиотечных методов почти никогда не документируется.
Но я могу сказать вам кое-что об этой разнице:
Если вы укажете только один формат для 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