Stavo confrontando le prestazioni degli usi sprintf e sono un po 'turbato da ciò che ho visto. Ho testato i seguenti 4 metodi, passando un'istanza di ClassWithToString in ciascuno (tranne PrintInt, che ha ricevuto il valore intero effettivo).Prestazioni di sprintf vs String.Format
type ClassWithToString() =
member this.X = 42
override this.ToString() = this.X.ToString()
let Print item : string =
sprintf "%A" item
let PrintInt item: string =
sprintf "%i" item
let PrintObj item: string =
sprintf "%O" item
let Format item : string =
System.String.Format("{0}", item)
I risultati per 50.000 iterazioni:
Print (%A): 3143ms
PrintInt (%i): 355ms
PrintObj (%O): 384ms
Format: 8ms
Per "Print" Capisco% A sta usando riflessione in modo che la lentezza non è scioccante, anche se per 50k iterazioni Sono rimasto sorpreso del totale tempo. In seguito, "PrintInt" e "PrintObj" non usano la riflessione e quindi sono di un ordine di grandezza più veloce, il che ha anche senso.
La parte che mi confonde è che alla luce dei risultati dello String.Format()
sprintf in generale sembra essere terribilmente lento (ed è stato visto nei profili delle applicazioni live). Perché le grandezze sprintf sono più lente di String.Format()? C'è un'alternativa migliore nello spazio F # che ho perso?
Poiché sai già che utilizza Reflection, che cosa stai cercando esattamente? – Daniel
Confrontate la [fonte '' printf'] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fs) con quella di 'StringBuilder.AppendFormat'. 'printf' fa molto di più, ad esempio, la stampa di raccolte ricorsive. – Daniel
Solo% A utilizza la riflessione. % sarei il caso base. – roken