Отказ: это микро-бенчмарк, пожалуйста, не комментируйте цитаты, такие как "преждевременная оптимизация - это зло", если вы чувствуете недовольство по поводу темы.
Примерами являются релиз, предназначенный для x64,.Net4.5 Visual Studio 2012 F # 3.0 и запуск в Windows 7 x64
После профилирования я сузил узкое место в одном из своих приложений, поэтому хочу поднять этот вопрос:
Наблюдение
Если в цикле for in
или Seq.iter
нет цикла, то ясно, что они имеют одинаковые скорости. (update2 vs update4)
Если внутри цикла for in
или Seq.iter
есть цикл, кажется, что Seq.iter
равно 2x, как быстрее, чем for in
. (обновление vs update3) странно? (если они будут работать в fsi, они будут похожи)
Если он предназначен для anycpu и запускается на x64, во времени нет разницы. Таким образом, вопрос становится следующим: Seq.iter(update3) увеличит скорость 2x, если цель равна 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
[<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