2010-03-24 30 views
10

Me gustaría saber si ParseExact es más rápido que Parse.Es DateTime.ParseExact() más rápido que DateTime.Parse()

Creo que debería ser ParseExact ya que usted ya dio el formato, pero también creo que toda la comprobación de la información de Cultura lo desaceleraría. Microsoft dice en cualquier documento sobre la diferencia de rendimiento entre los dos. El formato que se utilizará es un formato genérico 'aaaa/MM/dd'.

Por ejemplo:

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

Respuesta

13

Usted está solicitando a la diferencia en la velocidad durante dos métodos que son funcionalmente diferentes (cerca, pero sigue siendo diferente).

Elija la que sea más adecuada.

Y no, el rendimiento de los métodos de biblioteca casi nunca está documentado.

Pero te puedo decir algo sobre esa diferencia:

  • es pequeño,
  • que podría cambiar en futuras versiones
+0

no estoy seguro de que son funcionalmente diferentes. Inspeccioné el código para ambos métodos e internamente usan los mismos procedimientos. La única diferencia que pude encontrar es que ParseExact usa los formatos que especifique en lugar de todos los formatos para CultureInfo. – AMissico

+3

@AMissico sí, es exactamente por eso que son funcionalmente diferentes. – Sander

+1

@Sander: hmm, veo tu punto. Para mí, entiendo funcionalmente como un cambio en cómo funciona algo. En este caso, la única diferencia son los argumentos pasados ​​a los métodos. Internamente, está funcionando igual. – AMissico

4

Si sólo se especifica un formato para TryParseExact eso es todo lo intentará Parse prueba todos los formatos hasta encontrar la mejor coincidencia o encontrar la primera coincidencia. (No estoy seguro de cuál.) Lo hice hace unas semanas, con un CultureInfo personalizado. No probé el rendimiento, pero realicé pruebas unitarias en mis métodos de análisis (sin el CultureInfo personalizado, ver más abajo) contra 61.880 fechas almacenadas en una base de datos. No noté ningún problema de rendimiento.

Independientemente de si especifica un CultureInfo o no, las rutinas internas de análisis utilizarán CultureInvariant si no se pasa ninguna. Por lo tanto, CultureInfo no ralentiza el proceso. (Hay algunos éxitos de rendimiento para hebreo y otras fechas "exóticas" debido al análisis adicional que requieren.) A partir de mi revisión del código fuente de DateTime, la cantidad de formatos de cadenas determina qué tan rápido estas rutinas pueden analizar una cadena de fecha. Cuanto más formato, más lento. Si solo especifica uno, entonces el análisis será lo más rápido posible con los métodos ...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 
Cuestiones relacionadas