目前我需要一个不可变的数据结构(由 索引Int),它具有快速读取和更新(基本上,有效地 O(1)),但稍微慢一些的缺点(例如 O(logn))是可以接受的。不需要其他操作。我现在拥有的是:
Data.IntMap这是一棵基数树。它对于所有事情都有渐近 O(1),是目前最好的选择。Data.Sequence这是一棵手指树。它的最坏情况是 O(logn) 查找/更新,但缺点是 O(1)。这不太符合我的需求,并且IntMap在我的微基准测试中确实比 s 表现更差。Data.HashMap对于所有事情都有 O(logn) 且性能比 更差IntMap。我的问题是:是否有任何 Haskell 数据结构可以比IntMap这方面表现更好?
的内部实现Data.Unique 用作IORef存储下一个唯一整数的计数器。
据我所知,IORefs 并不完全是线程安全的。特别是,在这种情况下,我们需要自动取出数据并为其加一。如果它不是原子的,我们最终可能会在更新计数器之前读取两个相同的数字。
我知道newUniqueuse的实现只有在整个程序中使用时才atomicModifyIORef被认为是原子的。IORef
因此,我可以推断,如果我在程序中Unique不使用任何 s,那将是线程安全的。IORef问题是:当我使用另一个时会发生什么IORef?行为如何会出现问题?或者只有当我尝试atomicModifyIORef在其他IORef设备上使用时才会出现问题?