免責事項:これはマイクロベンチマークです。トピックに不満を感じる場合は、「時期尚早の最適化は悪です」などの引用にはコメントしないでください。
例は、x64、.Net4.5 Visual Studio 2012 F#3.0を対象としたリリースであり、Windows7x64で実行されます。
プロファイリング後、アプリケーションの1つのボトルネックを絞り込んだので、次の質問を提起したいと思います。
観察
for in
ループまたはの中にループがない場合Seq.iter
は、どちらも同じ速度であることは明らかです。(update2とupdate4)
for in
ループまたはの中にループがある場合Seq.iter
、それはのSeq.iter
2倍速いようfor in
です。(update vs update3)奇妙ですか?(fsiで実行した場合、それらは類似します)
anycpuを対象とし、x64で実行する場合、時間に違いはありません。したがって、質問は次のようになります。ターゲットがx64の場合、Seq.iter(update3)は2倍の速度を上げます
所要時間:
update: 00:00:11.4250483 // 2x as much as update3, why?
updatae2: 00:00:01.4447233
updatae3: 00:00:06.0863791
updatae4: 00:00:01.4939535
ソースコード:
open System.Diagnostics
open System
[<EntryPoint>]
let main argv =
let pool = seq {1 .. 1000000}
let ret = Array.zeroCreate 100
let update pool =
for x in pool do
for y in 1 .. 200 do
ret.[2] <- x + y
let update2 pool =
for x in pool do
//for y in 1 .. 100 do
ret.[2] <- x
let update3 pool =
pool
|> Seq.iter (fun x ->
for y in 1 .. 200 do
ret.[2] <- x + y)
let update4 pool =
pool
|> Seq.iter (fun x ->
//for y in 1 .. 100 do
ret.[2] <- x)
let test n =
let run = match n with
| 1 -> update
| 2 -> update2
| 3 -> update3
| 4 -> update4
for i in 1 .. 50 do
run pool
let sw = new Stopwatch()
sw.Start()
test(1)
sw.Stop()
Console.WriteLine(sw.Elapsed);
sw.Restart()
test(2)
sw.Stop()
Console.WriteLine(sw.Elapsed)
sw.Restart()
test(3)
sw.Stop()
Console.WriteLine(sw.Elapsed)
sw.Restart()
test(4)
sw.Stop()
Console.WriteLine(sw.Elapsed)
0 // return an integer exit code