почему Seq.iter в 2 раза быстрее, чем для цикла, если цель для x64?

Отказ от ответственности: это микро-тест, пожалуйста, не комментируйте такие кавычки, как "преждевременная оптимизация - зло если вы недовольны этой темой.

Примерами являются релиз, предназначенный для x64, .Net4.5 Visual Studio 2012 F # 3.0 и работающий в windows 7 x64

После профилирования я сузил узкое место одного из своих приложений, поэтому хочу поднять этот вопрос:

наблюдение

Если внутри нет петлиfor in петля илиSeq.iterТогда ясно, что они имеют одинаковую скорость. (обновление 2 против обновления 4)

Если внутри есть петляfor in петля илиSeq.iter, похоже на тоSeq.iter в 2 раза быстрееfor in, (обновление vs update3) странно? (если запустить в ФСИ, они будут похожи)

Если он предназначен для anycpu и работает в x64, нет никакой разницы во времени. Таким образом, вопрос становится:Seq.iter (update3) увеличит скорость в 2 раза, если цель x64

Затраченное время:
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

[]
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] 
                                  for y in 1 .. 200 do
                                      ret.[2]  Seq.iter (fun x ->
                                  //for y in 1 .. 100 do
                                      ret.[2]  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

Ответы на вопрос(2)

Ваш ответ на вопрос