最初,我有一段代码如下:
data Something = Something !Word32 !Word32
retrieveSomething :: Socket -> IO (Something)
retrieveSomething sock = do
...
function sock = do
(Something x y) <- retrieveSomething sock
let (a,b,c) = case x of
0 -> (foo,bar,baz)
1 -> (foo2,bar2,baz2)
...
doIOwithParams a b c
我使用-hy -hC"..."
RTS 选项对其进行了分析。
查看堆配置文件,我发现使用 3 元组会消耗太多内存,因此我使用(# a,b,c #)
了似乎更适合返回多个值的未装箱元组扩展名(即 )。
我或多或少确信堆使用量已经减少,因为我stuff
在尝试未装箱的元组之前通过显式调用来测试它,但是通过这样做,我现在无法观察成本中心分配的不同类型的值。
为了更清楚地说明这个问题,我可以看到在没有未装箱元组的情况下分析应用程序后,Something 类型(以及其他任何东西)在堆中占用了多少空间值。现在,在堆图上只能看到一种类型,我认为它与我在函数调用中进行的可变哈希表调用有关。
有没有办法来解决这个问题?
编辑:虽然未装箱的元组没有出现在配置文件上是完全有道理的,但我仍然很困惑为什么使用它们会隐藏函数调用/成本中心中的所有其他内容。
我尝试使用显式调用而不是使用未装箱的元组进行分析,如下所示:
case x of
0 -> doIOwithParams foo bar baz
1 -> doIOwithParams foo2 bar2 baz2
除了能够看到 3 元组的开销不再存在之外,函数中使用的Something 和所有其他类型也是可见的,这与我只能看到节点类型的未装箱元组的情况相反(这可能与我正在使用的哈希表有关,也可能不相关)与其他类型相比几乎没有空间。