簡體   English   中英

與F#中的Map發生多線程沖突

[英]does multithread conflict with Map in F#

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有多線程沖突,對嗎? 如果沒有,怎么能達到我的最初目標? 先感謝您

因此,我認為您是在嘗試一種啟發式方法,即庫假設只有少量任務時,僅使用單個線程會更快。

此代碼使我的計算機上的所有線程數最大化:

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"

重要更改:

  1. len大大降低。 在您的代碼中,幾乎所有時間都花在了創建矩陣上。
  2. 實際上確實在循環中工作。 在您的代碼中,循環有可能被優化為無操作。
  3. 運行更多任務。 這欺騙了調度程序使用更多線程,一切都很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM