有一些读取IORef的代码,并根据一些条件和计算创建一个新值。现在,它将新值写入该IORef。但它有可能根本没有改变。新值可能与旧值相同。
对于是在写入IORef之前检查值是否不同,还是不管怎样只写入IORef,需要考虑哪些因素?
在设置之前,writeIORef是否会检查该值是否已更改?
通过首先检查,您是否可以避免写入并尽可能节省一点性能?
发布于 2011-06-14 19:10:50
在设置之前,
是否会进行writeIORef检查以查看该值是否已更改?
不是的。writeIORef包装了writeSTRef,它被定义为
-- |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
的最简单推理
然后继续做下去。如果您处于想要调整程序的阶段,我建议您学习阅读GHC's human-readable generated output (Core),因为这样您就可以在每个程序的基础上做出这些类型的决定(在非常细粒度的级别上)。
https://stackoverflow.com/questions/6341778
复制相似问题