我在一個項目上工作時意外地注意到,只有一個額外的(未使用的)參數的同一個方法的管理運行速度比另一個快10倍,並啓用了優化。幾乎相同的方法之間的極好的性能差異
type Stream() =
static member private write (x, o, a : byte[]) = (for i = 0 to 3 do a.[o + i] <- byte((x >>> 24 - i * 8) % 256)); 4
static member private format f x l = Array.zeroCreate l |> fun a -> (f(x, 0, a) |> ignore; a)
static member private format1 f x l o = Array.zeroCreate l |> fun a -> (f(x, 0, a) |> ignore; a)
static member Format (value : int) = Stream.format (fun (x: int, i, a) -> Stream.write(x, i, a)) value 4
static member Format1 (value : int) = Stream.format1 (fun (x: int, i, a) -> Stream.write(x, i, a)) value 4
測試時,Stream.Format1
運行比Stream.Format
快得多,雖然私有成員Stream.format
和Stream.format1
之間的唯一區別只是o
說法,而且這是方法本身使用。
編譯器如何以不同的方式處理兩個幾乎相同的方法?
編輯:感謝您的解釋和抱歉的無知。
多少次迭代並運行,以獲得時序?一?一百萬?您需要使您的示例足夠寬泛,以平滑緩存效果,內核調度等。 – spraff 2012-01-12 16:03:50