首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否应该在编写IORef之前检查更改?

是否应该在编写IORef之前检查更改?
EN

Stack Overflow用户
提问于 2011-06-14 17:48:33
回答 1查看 197关注 0票数 3

有一些读取IORef的代码,并根据一些条件和计算创建一个新值。现在,它将新值写入该IORef。但它有可能根本没有改变。新值可能与旧值相同。

对于是在写入IORef之前检查值是否不同,还是不管怎样只写入IORef,需要考虑哪些因素?

在设置之前,writeIORef是否会检查该值是否已更改?

通过首先检查,您是否可以避免写入并尽可能节省一点性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-14 19:10:50

在设置之前,

是否会进行writeIORef检查以查看该值是否已更改?

不是的。writeIORef包装了writeSTRef,它被定义为

代码语言:javascript
复制
-- |Write a new value into an 'STRef'
writeSTRef :: STRef s a -> a -> ST s ()
writeSTRef (STRef var#) val = ST $ \s1# ->
    case writeMutVar# var# val s1#      of { s2# ->
    (# s2#, () #) }

先检查一下,你能不能避免写操作,并尽可能节省一点性能?

对于是在写入IORef之前检查值是否不同,还是不管怎样只写入IORef,需要考虑哪些因素?

这实际上取决于所讨论的算法。您尝试优化的是什么?读写的频率/比率是多少?您存储的是什么类型的数据?它是怎么包装的?对有问题的数据进行相等比较的成本是多少?

在决定是否要破坏性地就地更新单元格时,有一大堆因素需要考虑:一些算法特定,一些取决于缓存位置,另一些取决于GHC生成的代码的结构和形式。因此,回答你的问题是非常困难的。

引用唐纳德·库恩斯的话:

我们应该忘记小效率,比如97%的时间:过早优化是万恶之源

除非您处于这样一个阶段,即试图从一些很好理解的实现中获得每一点性能,否则您最好选择这样的方式

implement

  • easiest to

的最简单推理

然后继续做下去。如果您处于想要调整程序的阶段,我建议您学习阅读GHC's human-readable generated output (Core),因为这样您就可以在每个程序的基础上做出这些类型的决定(在非常细粒度的级别上)。

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

https://stackoverflow.com/questions/6341778

复制
相关文章

相似问题

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