模块 Data.ByteString 没有堆分析数据。

5

我试图为下面这个简单的Haskell代码生成堆内存分析报告,该代码是用于复制文件的:

import System.Environment
import System.IO
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as LB

naiveCopy :: String -> String -> IO ()
naiveCopy from to = do
  putStrLn $ "From: " ++ from
  putStrLn $ "To: " ++ to
  s <- B.readFile from
  B.writeFile to s

main = do
  args <- getArgs
  mapM (\ x-> putStrLn x) args
  naiveCopy (head args) ((head.tail) args)

使用ghc 8.0.1编译代码的命令:

ghc -o t -rtsopts -prof -fprof-auto t.hs

收集性能数据的命令:

./t +RTS -p -h -RTS in/data out/data && hp2ps -e8in -c t.hp

这里,in/data 是一个相当大的文件(约500MB),拷贝该文件程序将需要大约2秒钟。

问题在于,如果我使用严格模式下的 Data.ByteString ,就无法获得堆剖析数据,只会生成一个小小的 t.hp 文件而没有样本数据,如下所示:

JOB "t in/data out/data +RTS -p -h"
DATE "Thu Aug  4 20:19 2016"
SAMPLE_UNIT "seconds"
VALUE_UNIT "bytes"
BEGIN_SAMPLE 0.000000
END_SAMPLE 0.000000
BEGIN_SAMPLE 0.943188
END_SAMPLE 0.943188

并且有相应的配置表,如下所示: 没有性能数据的Strict ByteString

然而,如果我切换到lazy版本Data.ByteString.Lazy,则可以获得堆分析数据,配置表如下所示: 带有性能数据的Lazy ByteString

更新:感谢@ryachza,我添加了一个-i0参数来设置采样间隔并再次尝试,这次我得到了strict ByteString的采样数据,并且看起来很合理(我正在复制一个500M的文件,下面的配置表中内存分配峰值约为500M)。

./t +RTS -p -h -RTS in/data out/data && hp2ps -e8in -c t.hp

Strict ByteString with profiling data


2
请澄清“无法获取堆分析数据”。到底出了什么问题? - Reid Barton
问题在于 '*.hp' 文件中没有配置文件示例,我得到的看起来只是一个简单的文件头:JOB "t in/data out/data +RTS -p -h" DATE "Thu Aug 4 20:19 2016" SAMPLE_UNIT "seconds" VALUE_UNIT "bytes" BEGIN_SAMPLE 0.000000 END_SAMPLE 0.000000 BEGIN_SAMPLE 0.943188 END_SAMPLE 0.943188 - 6bb79df9
ByteStrings目前无法有实际意义的分析,详见https://gitlab.haskell.org/ghc/ghc/-/issues/7275进行讨论。 - L29Ah
1个回答

4
似乎运行时没有“有机会测量”堆。如果在您的 RTS 选项中添加 -s,则应打印一些时间和分配信息。当我运行此操作时,我看到分配的字节数和总内存使用非常高(文件大小),但最大居住时间(和样本数量)非常低,而经过的时间很长实际上“工作”时间几乎为零。
添加 RTS 选项 -i0 允许我可重复地将 bytestring 分配可视化为 PINNED(这是分类,因为 bytestring 内部使用的字节数组是分配在 GC 无法移动事物的区域中)。您可以尝试不同的 -h 选项,它们将分配关联到不同的成本中心(例如,-hy 应该显示 ARR_WORDS),但在这种情况下可能没有太多价值,因为 bytestrings 实际上只是“大块原始内存”。
我用来查找 RTS 选项的参考文献是(显然我对 GHC 版本并不特别关注-我想象这些标志不经常更改):
  1. https://downloads.haskell.org/~ghc/7.0.1/docs/html/users_guide/runtime-control.html
  2. https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接