当我在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手册中,我没有找到任何关于任务的内容。
1条答案
按热度按时间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或其他地方时,是否需要它们来最大化功能的数量。老实说,我不认为统计数据是非常有用的。