10
は、F#でこのコードを考えてみましょう:Seq.iterとSeq.mapはなぜそれほど遅くなっていますか?
let n = 10000000
let arr = Array.init n (fun _ -> 0)
let rec buildList n acc i = if i = n then acc else buildList n (0::acc) (i + 1)
let lst = buildList n [] 0
let doNothing _ =()
let incr x = x + 1
#time
arr |> Array.iter doNothing // this takes 14ms
arr |> Seq.iter doNothing // this takes 74ms
lst |> List.iter doNothing // this takes 19ms
lst |> Seq.iter doNothing // this takes 88ms
arr |> Array.map incr // this takes 33ms
arr |> Seq.map incr |> Seq.toArray // this takes 231ms!
lst |> List.map incr // this takes 753ms
lst |> Seq.map incr |> Seq.toList // this takes 2111ms!!!!
なぜSeq
モジュール上のiter
とmap
機能がArray
とList
モジュール同等物よりもそんなに遅いですか?
、あなたはおそらく、実際の原因について正しいですけれども – theburningmonk
をそのを指摘してくれてありがとうのためにダウンしたコードを遅らせます。それは本当に深いレベルの質問には答えません。なぜ彼らはMoveNextの使用を選択しましたか? linqライブラリを使って行ったように、タイプチェックで始めることができます。リストや配列の場合は、一致するバージョンを選択してから大きなシーケンスの違いを無視できます –