gpt4 book ai didi

haskell : Using unboxed tuples lead to weird types during heap profiling

转载 作者:行者123 更新时间:2023-12-02 00:19:45 24 4
gpt4 key购买 nike

最初,我有一段如下代码:

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 元组的开销不再存在之外,函数中使用的某些内容和所有其他类型也是可见的,这与我在未装箱元组中只能看到的情况相反与其他类型相比,节点类型(可能与我正在使用的哈希表相关,也可能无关)几乎不占用任何空间。

最佳答案

I had seen that using the 3-tuples consumed way too much memory, so I used unboxed tuples extension (i.e. (# a,b,c #)) which seemed better suited for returning multiple values.

只需使用具有严格字段的​​常规数据类型。然后 GHC 可以根据需要将其映射到堆或堆栈上未装箱的元组。

data Something = Something {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word32

这具有未装箱元组的所有优点,并且没有任何缺点。

关于 haskell : Using unboxed tuples lead to weird types during heap profiling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com