并行代码CPU使用率问题

马赫什
open System
open System.Diagnostics
open System.Threading.Tasks
open System.Collections

let computation input =
  input|> Array.map (fun x-> sqrt(float x))|> ignore

let computation1 (input:int[]) =
  input|> Array.map (fun x-> Convert.ToString(x,2)) |> ignore


let abc p = 

        for i in 1..50000 do
            [|for i in 1..100000 -> i|]
            |> computation 

Parallel.For(0,100,fun x->abc 0) |>ignore

嗨,在上面的程序,如果我跑了“应用计算()在”“ ABC() ”我看到的70-80%的CPU使用率。

但是,在“ abc() ”中带有“ calculation1()的同一代码中,我看到的CPU使用率仅为20%,而且我看到许多(一半的内核)内核处于空闲状态。

有人对此行为有想法吗?

我的CPU规格:启用了超线程的Intel Xeon CPU @ 3.40Hz总核心数:2个CPU,每个拥有8个核心= 16个总核心,具有HT = 2 * 16 = 32

a安

使用探查器可以很容易地找到它,但是在这种情况下,答案很明显:

Convert.ToString

会大大限制您的性能,使其受内存限制,(甚至更重要的是)受堆/ GC限制。

computation几乎是纯CPU工作。computation1在您执行的每个步骤中都使用堆-这意味着频繁的内存访问(实际上,尽管GC压缩可以抵消很多内存访问,但它甚至不能很好地使用CPU缓存),并且经常在堆上分配和收集字符串。堆和GC的性能非常好,但是每秒数百万/十亿个字符串确实在推动它。在大多数情况下,由于GC正在运行,因此您的代码已被暂停。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章