問題已經顯示出之前,其原因由約翰·帕爾默回答: why is Seq.iter and Seq.map so much slower?Seq.iter比本機映射慢:任何通用解決方案?
let ar = Array.zeroCreate<int> (64*1024*1024)
#time
//Real: 00:00:00.171, CPU: 00:00:00.171, GC gen0: 0, gen1: 0, gen2: 0
for i in 0 .. ar.Length - 1 do
ar.[i] <- ar.[i]*3
//Real: 00:00:00.327, CPU: 00:00:00.328, GC gen0: 0, gen1: 0, gen2: 0
ar |> Array.iteri(fun i _ -> ar.[i] <- ar.[i]*3)
//Real: 00:00:02.249, CPU: 00:00:02.250, GC gen0: 0, gen1: 0, gen2: 0
ar |> Seq.iteri(fun i _ -> ar.[i] <- ar.[i]*3)
我不知道是否有某種「內聯」,或者可以映射其他通用機制,說的序列(它的最後一個已知?)具體類型來加速這些行爲。 例如在這裏我有靜態的保證,我會迭代一個數組。
你知道理論上存在滿意的解決方案嗎? (會有什麼奇特的名字?)
是否有一些語言很好地承認和解決這個問題?
您可以使用F#不支持的更高版本的泛型來做到這一點。Haskell和Scala都可以這樣做,並且類型可以像'Iterable c => ca - >(a - >()) - >()',然後您可以爲'Array','Seq'和其他任何其他集合類型。你可能會發現感興趣的http://adriaanm.github.com/files/higher.pdf。 – Lee
你在做什麼,爲所有集合製作最佳的通用'map'和'iter'函數?我的猜測是,如果可能的話F#不會有獨立的模塊,比如'Array','List'和'Seq'。 – Daniel
編譯器實際上做了一些優化 - 在https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs第1027行檢查「Seq.Length」的實現儘管它不會爲'map/iter'類型的函數打擾 –