почему 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