以下の例では、リストの範囲がどれだけ遅いかに驚いています。私のマシンでは、for ループは 8 倍ほど高速です。
10,000,000 要素の実際のリストが最初に作成されますか? もしそうなら、なぜこれがコンパイラによって最適化されないのか (まだ行われていないこと以外に) 理由はありますか?
open System
open System.Diagnostics
let timeFunction f v =
let sw = Stopwatch.StartNew()
let result = f v
sw.ElapsedMilliseconds
let length = 10000000
let doSomething n =
(float n) ** 0.1 |> ignore
let listIter n =
[1..length] |> List.iter (fun x -> doSomething (x+n))
let forLoop n =
for x = 1 to length do
doSomething (x+n)
printf "listIter : %d\n" (timeFunction listIter 1) // c50
GC.Collect()
printf "forLoop : %d\n" (timeFunction forLoop 1) // c1000
GC.Collect()