Haskell GHC -s选项对TASKS度量的解释

v2g6jxz6  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(76)

当我在GHC中给予时,-s选项显示了一个TASKS指标,如下所示,我不知道它意味着什么:

548,321,960 bytes allocated in the heap
      31,615,128 bytes copied during GC
       1,538,384 bytes maximum residency (17 sample(s))
          87,272 bytes maximum slop
              24 MiB total memory in use (0 MB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        54 colls,    54 par    0.044s   0.036s     0.0007s    0.0016s
  Gen  1        17 colls,    16 par    0.021s   0.018s     0.0010s    0.0023s

  Parallel GC work balance: 18.96% (serial 0%, perfect 100%)

  TASKS: 10 (1 bound, 9 peak workers (9 total), using -N4)

  SPARKS: 8999 (8195 converted, 804 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.001s elapsed)
  MUT     time   13.915s  (  3.857s elapsed)
  GC      time    0.066s  (  0.054s elapsed)
  EXIT    time    0.001s  (  0.007s elapsed)
  Total   time   13.984s  (  3.920s elapsed)

  Alloc rate    39,405,087 bytes per MUT second

  Productivity  99.5% of total user, 98.4% of total elapsed

字符串
我说任务:10 1绑定9峰值工人。在GHC手册中,我没有找到任何关于任务的内容。

yizd12fk

yizd12fk1#

任务是GHC线程运行时的内部结构,用于表示O/S线程,所以“任务”或多或少是一个O/S线程。这并不完全正确。如果一个线程调用外部代码,然后又调用回Haskell,则会为同一个O/S线程分配一个额外的任务,用于in-call,但大多数情况下都是如此。
线程运行时非常快地启动了一些任务(因此O/S线程),这些任务的数量等于功能数量的两倍加2,因此即使是使用-N4运行的main = putStrLn "Hello, World!"程序也将运行10个任务(使用-N32运行66个任务)。
运行时安排在任务中实际运行CPU密集型代码,直到功能数量,因此即使使用-N4,您可能有10个任务,其中只有4个任务将运行用户代码,而其余的都在睡眠。此外,RTS可能会分配额外的任务,其关联的O/S线程超过初始数量,当有足够的CPU限制的工作可用并且有足够的现有任务卡在I/O或其他地方时,是否需要它们来最大化功能的数量。
老实说,我不认为统计数据是非常有用的。

相关问题