let len = 25000000
let map = Map.ofArray[|for i =1 to len do yield (i,i+1)|]
let maparr = [|map;map;map;map|]
let f1 i =
for i1 =1 to len do
let l1 = maparr.[i-1].Item(i1)
()
let index = [|1..4|]
let _ = index |> Array.Parallel.map f1
printf "done"
我发现上面的代码只有一个核心正在全速运行。但我除了是所有四个线程正在与高水平的CPU使用一起工作。所以看起来与Map的多线程冲突,我是对的吗?如果没有,怎样才能达到我的初步目标?提前谢谢
答案 0 :(得分:1)
所以我认为你正在绊倒一个启发式,当只有少量任务时库就会假设,只使用一个线程就会最快。
此代码最大化了我计算机上的所有线程:
let len = 1000000
let map = Map.ofArray[|for i =1 to len do yield (i,i+1)|]
let maparr = [|map;map;map;map|]
let f1 (m:Map<_,_>) =
let mutable sum = 0
for i1 =1 to len do
let l1 = m.Item(i1)
for i = 1 to 10000 do
sum <- sum + 1
printfn "%i" sum
let index = [|1..40|]
printfn "starting"
index |> Array.map (fun t -> maparr.[(t-1)/10]) |> Array.Parallel.iter f1
printf "done"
重要变化: