haskell - 这个统计输出是什么意思?

标签 haskell ghc

所以我有一个基于 io-streams 的管道,我刚刚运行(解释)并使用 -s 转储统计信息:

    123,680 bytes allocated in the heap
       3,464 bytes copied during GC
      68,912 bytes maximum residency (1 sample(s))
      13,008 bytes maximum slop
           1 MB total memory in use (0 MB lost due to fragmentation)

                                 Tot time (elapsed)  Avg pause  Max pause
Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s
Gen  1         1 colls,     0 par    0.000s   0.000s     0.0002s    0.0002s

INIT    time    0.000s  (  0.000s elapsed)
MUT     time    0.001s  (299.935s elapsed)
GC      time    0.000s  (  0.000s elapsed)
EXIT    time    0.000s  (  0.000s elapsed)
Total   time    0.134s  (299.936s elapsed)

%GC     time       0.2%  (0.0% elapsed) 

Alloc rate    106,371,724 bytes per MUT second

Productivity  99.7% of total user, 0.0% of total elapsed

所以基本上没有时间花在垃圾收集上。但是我感到困惑的是括号中的时间。来自 the docs括号中的时间和时间之间的区别是什么并不明显。任何人都可以对此有所了解吗?

最佳答案

括号中的时间是挂钟时间。如果你看着墙上的时钟,这是一个人(你)在程序运行时所经历的时间。 CPU 时间是你的程序经历的时间:

If you use the -s flag then, when your program finishes, you will see something like this (the exact details will vary depending on what sort of RTS you have, e.g. you will only see profiling data if your RTS is compiled for profiling):

    36,169,392 bytes allocated in the heap
     4,057,632 bytes copied during GC
     1,065,272 bytes maximum residency (2 sample(s))
        54,312 bytes maximum slop
             3 MB total memory in use (0 MB lost due to fragmentation)

Generation 0:    67 collections,     0 parallel,  0.04s,  0.03s elapsed
Generation 1:     2 collections,     0 parallel,  0.03s,  0.04s elapsed

SPARKS: 359207 (557 converted, 149591 pruned)

INIT  time    0.00s  (  0.00s elapsed)
MUT   time    0.01s  (  0.02s elapsed)
GC    time    0.07s  (  0.07s elapsed)
EXIT  time    0.00s  (  0.00s elapsed)
Total time    0.08s  (  0.09s elapsed)

%GC time      89.5%  (75.3% elapsed)

Alloc rate    4,520,608,923 bytes per MUT second

Productivity  10.5% of total user, 9.1% of total elapsed

[…]

Next there is the CPU time and wall clock time elapsed broken down by what the runtime system was doing at the time. INIT is …

挂钟时间通常大于 CPU 时间,除非您同时使用多个内核。使用 getLinesleep 可以实现 CPU 时间非常而挂钟时间很高的简单示例回声:

$ {sleep 10; echo 1} | ghc -e 'getLine' +RTS -s > /dev/null

      32,006,664 bytes allocated in the heap
      20,644,024 bytes copied during GC
       5,813,624 bytes maximum residency (6 sample(s))
         156,360 bytes maximum slop
              12 MB total memory in use (0 MB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        37 colls,     0 par    0.011s   0.011s     0.0003s    0.0009s
  Gen  1         6 colls,     0 par    0.052s   0.052s     0.0087s    0.0105s

  TASKS: 5 (1 bound, 4 peak workers (4 total), using -N1)

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

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time    0.016s  (  9.903s elapsed) <------------
  GC      time    0.063s  (  0.063s elapsed)
  EXIT    time    0.010s  (  0.010s elapsed)
  Total   time    0.125s  (  9.977s elapsed)

  Alloc rate    1,956,305,120 bytes per MUT second

  Productivity  48.7% of total user, 0.6% of total elapsed

如您所见,MUT CPU 时间很短,而 MUT 挂钟时间很长,因为应用程序等待输入。

关于haskell - 这个统计输出是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37696504/

相关文章:

list - Haskell 中的所有列表轮换

haskell - 如何将数据类型带入值(value)级别?

haskell - 如何捕获实例化特定类的所有异常?

haskell - Haskell中的这些方括号是什么?

haskell - 在 ghci 和 ghc 之间切换时如何防止重新编译

haskell - 为什么在尝试映射列表列表时会出现此错误?

haskell - 相当于 `_1`风格的元组镜头快捷方式的数据类?

haskell - 为什么使用 -XSafe 时 runghc 失败?

haskell - 为什么函数不能采用仅受类型类约束的类型?

haskell - 隐式参数在 GHC 中内联是否是一个困难?