如何解决编写IORef之前是否应该检查更改?
| 那里的代码读取IORef并基于某些条件和计算来创建新值。现在,它将新值写入该IORef。但是有可能根本没有改变。新值可能与旧值相同。 关于是否在写入IORef之前检查值是否有所不同,还是只写IORef而有什么考虑? 在设置之前,writeIORef是否检查值是否已更改? 通过先检查,是否可以避免写操作并可能在性能上节省一点?解决方法
在设置之前,writeIORef是否检查值是否已更改?
编号“ 0”包装“ 1”,定义为
-- |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生成的代码的结构和形式。这样,很难回答您的问题。
Donald Knuth的话:
我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源
除非您正处于尝试从一些易于理解的实施方案中寻找各种性能的阶段,否则您最好选择一条可行的道路
实施最简单
最容易推理的
并继续前进。如果您正处于要调整程序的阶段,我建议您学习阅读GHC的人类可读生成的输出(Core),这样您便可以在每个程序的基础上进行这些决策(非常精细的级别)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。