首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IORef的内存占用和性能

IORef的内存占用和性能
EN

Stack Overflow用户
提问于 2020-05-04 05:23:39
回答 1查看 132关注 0票数 3

我想知道,如果我知道a的大小是x,那么IORef a类型的变量的内存占用量是多少。另外,与常规变量赋值(如x= 3)相比,应用于整数的函数writeIORef的预期性能如何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-04 06:58:24

在Haskell中,IORef a的行为类似于单元素可变数组。IORefdefinition如下所示,不考虑新类型包装:

代码语言:javascript
复制
data IORef a = IORef (MutVar# RealWorld a) 

在这里,MutVar# RealWorld a是一个原始的可变引用类型。它是一个指向两个单词的指针,一个头和一个有效负载,而有效负载本身就是一个指向正常提升的Haskell对象的指针。因此,MutVar的开销是两个字(在64位系统上为16字节)和一个间接地址。

因此,MutVar#的开销是一个额外的间接地址和一个额外的报头字。这是不可避免的。相反,IORef构造函数的开销也是一个头字和一个间接的,但是可以通过解压缩IORef来消除

代码语言:javascript
复制
data Foo a = Foo !(IORef a) a a 

在这里,IORef上的一声巨响导致底层MutVar被解压到Foo中。但是,当我们定义新的数据类型时,这种解包就会起作用,但是如果我们使用任何现有的参数化类型,比如列表,它就不会起作用。在[IORef a]中,我们通过两个额外的间接路径来支付全部成本。

如果将IORef用作函数的参数,则GHC优化通常也会将其解包:如果使用优化进行编译,则IORef a -> b通常会拆箱为MutVar# RealWorld a -> b

但是,当您使用大量IORef-s时,上述所有开销都不如garbage collection中的开销重要。为了避免这种情况,建议使用单个可变数组而不是多个IORef-s。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61581811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档