2010-03-24 11 views
10

Mi piacerebbe sapere se ParseExact è più veloce di Parse.È DateTime.ParseExact() più veloce di DateTime.Parse()

Penso che dovrebbe essere ParseExact dal momento che hai già dato il formato, ma penso anche che tutto il controllo per le informazioni sulla cultura lo rallenterebbe. Microsoft dice in qualsiasi documento sulla differenza di prestazioni tra i due. Il formato da utilizzare è un formato generico "aaaa/MM/gg".

Ad esempio:

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

risposta

13

si sta chiedendo la differenza di velocità per i due metodi che sono funzionalmente differenti (vicino ma ancora diverso).

Basta scegliere quello più appropriato.

E no, le prestazioni dei metodi di libreria non sono quasi mai documentate.

Ma posso dirvi qualcosa su quella differenza:

  • è piccolo,
  • potrebbe cambiare nelle future versioni
+0

io non sono sicuro che sono funzionalmente differenti. Ho ispezionato il codice per entrambi i metodi e internamente utilizzano le stesse procedure. L'unica differenza che ho trovato è che ParseExact utilizza i formati specificati al posto di tutti i formati per un oggetto CultureInfo. – AMissico

+3

@AMissico sì, questo è esattamente il motivo per cui sono funzionalmente diversi. – Sander

+1

@Sandro: hmm, capisco il tuo punto. Per me, capisco funzionalmente come un cambiamento nel modo in cui qualcosa funziona. In questo caso, l'unica differenza sono gli argomenti passati ai metodi. Internamente funziona allo stesso modo. – AMissico

4

se si specifica un solo formato per TryParseExact che è tutto ci proverò. Parse prova tutti i formati fino a quando non viene trovata una corrispondenza migliore o viene trovata la prima corrispondenza. (Non sono sicuro di quale.) L'ho fatto poche settimane fa, con un CultureInfo personalizzato. Non ho provato le prestazioni, ma ho eseguito test unitari sui miei metodi di analisi (senza CultureInfo personalizzato, vedi sotto) contro 61.880 date memorizzate in un database. Non ho notato problemi di prestazioni.

Indipendentemente se si specifica CultureInfo o meno, le routine di analisi interne utilizzeranno CultureInvariant se non viene passato nessuno. Pertanto, CultureInfo non rallenta il processo. (Ci sono alcuni colpi di prestazioni per l'ebraico e altre date "esotiche" a causa di un'ulteriore analisi che richiedono.) Dalla mia recensione del codice sorgente per DateTime, il numero di formati di stringa determina la velocità con cui queste routine possono analizzare una stringa di data. Più il formato è, più lento. Se ne stai specificando solo uno, l'analisi è veloce quanto possibile con i metodi ...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