Mah*_*esh 0 f# task-parallel-library
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
Run Code Online (Sandbox Code Playgroud)
嗨,在上面的程序中如果我在" abc() "中使用" computation() " 运行应用程序,我看到CPU利用率为70-80%.
但是在" abc () "中使用" calculate1() "的代码相同,我看到只有20%的CPU利用率,而且我看到很多(一半内核)内核空闲.
有没有人对这种行为有所了解?
我的CPU规格:Intel Xeon CPU @ 3.40Hz,启用超线程总核心:2个CPU,每个8核= 16个总核心,HT = 2*16 = 32
应该很容易找到一个分析器,但在这种情况下,答案是相当明显的:
Convert.ToString
Run Code Online (Sandbox Code Playgroud)
将大大限制你的性能,使其受内存限制,并且(可能更重要的是)堆/ GC绑定.
computation几乎是纯粹的CPU工作.computation1将堆用于你所做的每一步 - 这意味着频繁的内存访问(事实上,它甚至不能很好地使用CPU缓存,虽然GC压缩可以抵消这一点),并经常在堆上分配和收集字符串.堆和GC的性能非常高,但每秒数百万/十亿字符串才真正推动它.大多数情况下,由于GC正在运行,您的代码将被暂停.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |