我正在比较 sprintf 用法的性能,并且对我所看到的感到有些困扰。我测试了以下 4 种方法,将 ClassWithToString 的实例传递给每个方法(PrintInt 除外,它接收实际的整数值)。
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)
50,000 次迭代的结果:
Print (%A): 3143ms
PrintInt (%i): 355ms
PrintObj (%O): 384ms
Format: 8ms
对于“打印”,我知道 %A 正在使用反射,所以那里的缓慢并不令人震惊,尽管对于 50k 次迭代,我对总时间感到惊讶。之后,“PrintInt”和“PrintObj”不使用反射,因此速度快了一个数量级,这也是有道理的。
让我感到困惑的部分是,鉴于String.Format()
sprintf 的结果通常看起来非常缓慢(并且在实时应用程序的配置文件中已经看到)。为什么 sprintf 量级比 String.Format() 慢?在我错过的 F# 空间中是否有更好的选择?