この問題は以前にも現れており、その理由は John Palmer によって回答され ています。
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)
これらの動作を加速するために、シーケンスを(最後に知られている?)具象型にマッピングできる、ある種の「インライン化」またはその他の一般的なメカニズムがあるかどうか疑問に思います。たとえば、ここでは、配列を反復処理するという静的な保証があります。
これに対して理論的に存在する満足のいく解決策を知っていますか? (派手な名前は何ですか?)
その問題をうまく認識して解決する言語はありますか?